visual utf8 u00e9 u00 studio proyecto open net guille convertir characters delphi unicode utf-8 vb6 utf-16

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.