2012-05-12 13 views
0
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

類似:http://stackoverflow.com/questions/259836/what-is-the-best-way-to-convert-tbytes-utf-16-to-a-string – Harriv

+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; 
+0

ありがとう。しかし、doest work ..このコードUTF16 LE - > UTF8? – user1390537

+0

はい、UTF16は両方の機能でUTF16-LEです。 UTF16-BEが必要な場合は、 'SysUtils.pas'から' TEncoding'クラスを使用してください。 – kludg

+0

ありがとうございました! – user1390537

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で変換を処理させるだけです。

+0

functionの使い方? UTF8FromUTF16( 'Some Text'); <エラー – user1390537

+0

元のVBコードは文字列ではなくバイト配列に基づいていました。代わりに文字列を使用する場合は、このコードは必要ありません。私が言ったように、代わりに単純にDelphiの 'UnicodeString'と' UTF8String'型を使い、3( "var sUtf16:UnicodeString; sUtf8:UTF8String; begin sUtf16:= 'Some Text'; sUtf8: = sUtf16; end; ' –

関連する問題