2

を使用して文字列を変換しようとしています

Var
 encode:ansistring;
begin
  encode:=UTF8Encode('اختبار');
  showmessage(encode);
end;

Delphi7では正常に機能しています

ただし、Delphi XE2では、テキストを疑問符として送信します

助言がありますか?

4

1 に答える 1

15

Delphi 7コードでは、おそらく次のようなものを書いています。

var
  UTF8: string;
  InputString: WideString;//I guess that you used WideString
.....
UTF8 := UTF8Encode(InputString);

これstringは、のエイリアスであるDelphi7では問題ありませんでしAnsiStringた。XE2では、ジェネリック型はUTF-16でエンコードされstringたエイリアスになりました。UnicodeStringつまり、上記のコードがXE2によってコンパイルされると、によって返されるUTF-8でエンコードされたバッファーはUTF8EncodeUTF-16でエンコードされたテキストとして解釈されます。そして、その不一致は、疑問符でいっぱいの文字列につながるものです。

だから、あなたが書いたばかりなら

var
  UTF8: AnsiString;
  InputString: string;//aliased to UnicodeString
.....
UTF8 := UTF8Encode(InputString);

そうすれば、Delphi7コードの場合と同じ動作になります。

ただし、これはUnicodeDelphiでそれを行う方法ではありません。代わりに、UTF8Stringタイプを使用する必要があります。これは、コードページ(UTF-8コードページ)AnsiString(65001)を含む8ビット文字単位の文字列を意味するものとして定義されます。65001これを行う場合UTF8Encode、文字列タイプに付加されたエンコーディングは、コンパイラが文字列を変換するコードを生成できることを意味するため、呼び出す必要はまったくありません。今、あなたは単に書くでしょう:

var
  UTF8: UTF8String;
  InputString: string;//aliased to UnicodeString
.....
UTF8 := InputString;

Delphi 2009以降のUnicodeの側面に関する主な参考資料は、MarcoCantùのホワイトペーパー「DelphiとUnicode」です。先に進む前に読むことをお勧めします。

于 2012-04-09T11:51:34.110 に答える