utf8 - VB 6.0-> Conversión Delphi XE2
visual studio open vb6 project (2)
Su código no establece la codificación de la cadena resultante. Delphi (desde Delphi 2009) requiere información de codificación para cadena ANSI, de lo contrario se usa la configuración regional predeterminada del sistema. Una versión de trabajo de tu código es:
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;
Pero no necesita todo eso: Delphi realiza conversiones de cadenas para usted:
function UTF8FromUTF16_2(sUTF16: UnicodeString): UTF8String;
begin
Result := sUTF16;
end;
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;
Una traducción literal se vería así:
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;
En Delphi 2009+, hay un enfoque mucho más simple:
function UTF8FromUTF16(const abytUTF16: TBytes): TBytes;
begin
Result := TEncoding.Convert(TEncoding.Unicode, TEncoding.UTF8, abytUTF16);
end;
Aún más fácil, si trabaja con cadenas en lugar de bytes, puede simplemente asignar una WideString
o una WideString
(ambas codificadas con UTF-16) a una UTF8String
y dejar que la RTL maneje la conversión por usted.