2

Netty で http サーバーを開発しています。場合によっては、サーバーが 1x1 の透明ピクセルに応答する必要があります。そこで、base64 で GIF 透明ピクセルをハードコーディングし、次のコードで返しました。

String pixel_string= new String (Base64.decodeBase64("R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="));
HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
response.setContent(ChannelBuffers.copiedBuffer(pixel_string, CharsetUtil.UTF_8));

EDIT : content-type も設定します: response.setHeader(HttpHeaders.Names.CONTENT_TYPE, "image/gif"); Chrome では、すべて問題ありません。ただし、Firefox は、ピクセル データが無効であるため、ピクセルを表示できない (これは私のアプリにとってはかなり悪いことです) と言っています。多くの調査の後、文字セットをIso-8859-1に変更することで、最終的に修正を見つけました。

response.setContent(ChannelBuffers.copiedBuffer(
            responseBuilder.pixel_string, CharsetUtil.ISO_8859_1));

なぜ動くのかわからないので、場合によってはトラブルに巻き込まれるのではないかと思います。Firefox の設定を (デフォルトで UTF8 にするために) 変更しようとしましたが、あまり変わりません。

Firefox が UTF-8 ではなく ISO-8859 エンコーディングを受け入れるのはなぜですか? それを変更できますか?誰かが問題の原因と、ユーザーの設定に関係なく機能することを確認する方法についての手がかりを持っていますか?

ありがとう

4

2 に答える 2

1

エンコーディングを受け入れるかどうかは Firefox ではありません。それはあなたのサーバーです。

base64 デコードを行うと、いくつかの文字を含む文字列が生成されます...しかし、実際に生成されたのは、文字として考えているバイトでした。Java String は UTF-16 文字列を保持するコンテナであるため、実際に行っていることは、各バイトを取得し、それを 16 ビット整数として扱い、それらのコード単位で構成される UTF-16 「文字列」を構築することです。 .

しかし、これらすべてをネットワーク上に配置したい場合は、文字列をバイトに変換する必要があり、引数 tocopiedBufferはその方法を示しています。UTF-8 に変換する場合、上位ビットが設定されたバイトに由来する文字は、2 バイトの UTF-8 シーケンスとしてエンコードされることになります。一方、ISO-8859-1 に変換する場合、変換は各 UTF-16 コード単位の上位バイトを削除するだけです (あなたの場合はとにかく常にゼロです)。

したがって、ISO-8859-1 への変換は、base64 デコードから取得した実際のバイト配列を生成しますが、UTF-8 への変換は....正確なバイトに応じて、実際には意味をなさないかもしれない何か他のものを生成します。値。

于 2013-04-09T07:22:12.200 に答える
0

呼び出すコンストラクターが、copiedBuffer使用しているデータの型 (バイナリ) に適していません。Netty API の JavaDoc によると、呼び出しているのは次のとおりです。

指定された文字セットでエンコードされた指定された文字列を内容とする新しいビッグ エンディアン バッファーを作成します。

これは、バイナリ データが UTF-8 に "変換" されていることを意味します (これは意味がありません)。生成されたファイルを保存して 16 進エディタで表示しようとすると、ファイルが破損していることがわかるでしょう。

次のようなものを試してください(テストされていないコード):

static byte[] pixel_data = Base64.decodeBase64("R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==");
HttpResponse response = ...
response.setHeader(HttpHeaders.Names.CONTENT_TYPE, "image/gif");
response.setContent(ChannelBuffers.copiedBuffer(pixel_data));
于 2013-04-08T20:15:32.867 に答える