Public Function UTF8FromUTF16(ByRef abytUTF16() As Byte) As Byte()
Dim lngByteNum As Long
Dim abytUTF8() As Byte
Dim lngCharCount As Long
On Error GoTo ConversionErr
lngCharCount = (UBound(abytUTF16) + 1) \ 2
lngByteNum = WideCharToMultiByteArray(CP_UTF8, 0, abytUTF16(0), _
lngCharCount, 0, 0, 0, 0)
If lngByteNum > 0 Then
ReDim abytUTF8(lngByteNum - 1)
lngByteNum = WideCharToMultiByteArray(CP_UTF8, 0, abytUTF16(0), _
lngCharCount, abytUTF8(0), lngByteNum, 0, 0)
UTF8FromUTF16 = abytUTF8
End If
Exit Function
ConversionErr:
MsgBox " Conversion failed "
End Function
var
abytUTF8 : array of Byte; // Global
function UTF8FromUTF16(sUTF16 : WideString) : pAnsiChar;
var
lngByteNum : integer;
lngCharCount : integer;
begin
// On Error GoTo ConversionErr
result := nil;
lngCharCount := Length(sUTF16);
lngByteNum := WideCharToMultiByte(CP_UTF8, 0, @sUTF16[1],
lngCharCount, nil, 0, nil, nil);
If lngByteNum > 0 Then
begin
SetLength(abytUTF8, lngByteNum+1);
abytUTF8[lngByteNum] := 0;
lngByteNum := WideCharToMultiByte(CP_UTF8, 0, @sUTF16[1],
lngCharCount, @abytUTF8[0], lngByteNum, nil, nil);
result := pAnsiChar(@abytUTF8[0]);
End;
End;
答案 0 :(得分:5)
您的代码未设置结果字符串的编码。 Delphi(自Delphi 2009起)需要ANSI字符串的编码信息,否则使用默认的系统区域设置。您的代码的工作版本是:
function UTF8FromUTF16(sUTF16: UnicodeString): UTF8String;
var
lngByteNum : integer;
lngCharCount : integer;
begin
Result := '';
lngCharCount := Length(sUTF16);
if lngCharCount = 0 then Exit;
lngByteNum := WideCharToMultiByte(CP_UTF8, 0, @sUTF16[1], lngCharCount, nil, 0, nil, nil);
if lngByteNum > 0 then begin
SetLength(Result, lngByteNum);
WideCharToMultiByte(CP_UTF8, 0, @sUTF16[1], lngCharCount, @Result[1], lngByteNum, nil, nil);
end;
end;
但是你不需要那么多 - Delphi为你执行字符串转换:
function UTF8FromUTF16_2(sUTF16: UnicodeString): UTF8String;
begin
Result := sUTF16;
end;
答案 1 :(得分:1)
字面翻译如下所示:
function UTF8FromUTF16(const abytUTF16: TBytes): TBytes;
var
lngByteNum: LongInt;
abytUTF8: TBytes;
lngCharCount: LongInt;
begin
Result := nil;
lngCharCount := Length(abytUTF16) div 2;
lngByteNum := WideCharToMultiByte(CP_UTF8, 0, PWideChar(abytUTF16), lngCharCount, nil, 0, nil, nil);
if lngByteNum > 0 then
begin
SetLength(abytUTF8, lngByteNum);
lngByteNum := WideCharToMultiByte(CP_UTF8, 0, PWideChar(abytUTF16), lngCharCount, PAnsiChar(abytUTF8), lngByteNum, nil, nil);
Result := abytUTF8;
Exit;
end;
if GetLastError <> 0 then
MessageBox(0, ' Conversion failed ', '', MB_OK);
end;
在Delphi 2009+中,有一种更简单的方法:
function UTF8FromUTF16(const abytUTF16: TBytes): TBytes;
begin
Result := TEncoding.Convert(TEncoding.Unicode, TEncoding.UTF8, abytUTF16);
end;
更简单的是,如果您使用字符串而不是字节,那么您只需将WideString
或UnicodeString
(两者都是UTF-16编码)分配给UTF8String
让RTL为您处理转换。