1

UTF-8 を使用してテキスト入力ストリームを読み取るクライアント j2me アプリケーション

reader = new InputStreamReader(in,"UTF-8");

私のサーバーは、接続時にこのステートメントを使用してテキストを送信します

AContext->Connection->IOHandler->WriteLn(cxMemo1->Text,TEncoding::UTF8);

しかし、????????????????????????????? のような奇妙な文字を示す結果テキスト ???????????????

どこが間違っていますか?

そんな風にutf-8エンコーディングのデータファイルから読み込もうとした時も

AContext->Connection->IOHandler->WriteFile("c:\\fids.xml");

それはすべて同じです!

4

2 に答える 2

0

「?」文字は、データがUnicodeからAnsiへの変換を経て、変換されるUnicode文字をサポートしないAnsi文字セットに変換されるときに発生します。

どのバージョンのC++Builderを使用していますか?CB2009より前のバージョンでは、渡すAnsiStringデータのエンコーディングをIndyに通知する必要があります。TIdTextEncoding::ASCIIほとんどの文字列ベースの操作では、IndyのデフォルトはASCII(つまり:)です。AAnsiEncodingこれは、オプションのパラメーター、TIdIOHandler::DefAnsiEncodingプロパティ、またはグローバルIdglobal::GIdDefaultAnsiEncoding設定のいずれかを使用して、必要に応じてオーバーライドできます。正しいエンコーディングを指定しないと、AnsiStringデータがUTF-8に変換される前にUnicodeに正しく変換されない場合があります。例えば:

AContext->Connection->IOHandler->WriteLn(cxMemo1->Text, TIdTextEncoding_UTF8, TTIdTextEncoding_Default);

または:

AContext->Connection->IOHandler->DefAnsiEncoding = TIdTextEncoding_Default;
AContext->Connection->IOHandler->WriteLn(cxMemo1->Text, TIdTextEncoding_UTF8);

TIdIOHandler::DefStringEncodingすべての呼び出しでUTF-8エンコーディングを指定したくない場合は、オプションでこのプロパティを使用することもできます。

AContext->Connection->IOHandler->DefStringEncoding = TIdTextEncoding_UTF8;
AContext->Connection->IOHandler->WriteLn(cxMemo1->Text);

WriteFile()そうは言っても、J2MEが正しく処理していないデータも送信しているという事実は、Indyが問題の根本ではないことを示しています。WriteFile()は、生のファイルデータをそのまま接続に複製するだけで、解釈はまったく行われません。UTF-8でエンコードされたファイルを送信すると、UTF-8でエンコードされたオクテットがJ2MEに送信されます。

Indyが送信しているデータを確認するには、Wiresharkなどのパケットスニファを使用することをお勧めします。それは、インディが本当に過ちを犯しているかどうかを確実に教えてくれます。

* PS:上記の例では、直接TIdTextEncodingではなくIndyのマクロを使用していることに注意してください。TEncodingこれは、IndyのTIdTextEncodingロジックが、EmbarcaderoのTEncodingクラスのいくつかのバグを回避するためです。また、Indy 11での直接サポートを段階的に廃止しTEncoding、拡張してTIdTextEncoding、IndyがEmbarcaderoが提供するよりも多くの制御を行えるようにします。

于 2011-03-19T00:02:38.070 に答える
0

Indy 10 は UTF-8 エンコーディングを完全にサポートしています。私自身、TIdFTP コンポーネントを使用して作業し、Unicode テキスト ファイルを正常にアップロードしました。私ができることから:

  1. 接続/転送タイプがftASCIIではなくに設定されていftBinaryます。
  2. J2ME アプレット/ホスト プラットフォームは UTF-8 をサポートしていません
于 2011-03-18T05:56:46.190 に答える