2012-02-16 11 views
0

0-255の値を含む配列 "result"があります。私はもともとバイト[]として宣言しましたが、私は128を書く必要があるとき、結果[i]は値-128をとり、出力ファイルには "8300"と最終的に読み込まれる "€"と書かれています。Java(ServletOutputStream)でASCII 0-255を書き込むデータ型

そのバイトが-128から127までの値しか受け付けないことを確認してください。0-255の値にはどのようなデータ型を使うべきですか?

コンテンツタイプを変更するか、任意の文字セットヘッダーを追加する必要がありますか?

おかげ

res.setContentType("application/octet-stream"); 
res.setHeader("Content-Disposition","attachment;filename=output.js"); 
ServletOutputStream os = res.getOutputStream(); 
byte[] result=encode(req.getParameter("originalScript")); // Result[i]=-128 (should be 128) 
os.write(result,0,result.length); // result[i] on output.js is written as "€" (8364) 

答えて

2

あなたは、いくつかの概念を混合することによって混乱しています。

まず、int 128は、バイト-128(int 255 ==バイト-1,254 == -2、... 128 = -128)と同じです。バイトはであり、符号はであり、符号情報は最上位ビットである。あなたの間違いは、バイト値をintに変換する正しい方法を使用しなかったことです。この問題を修正するには、このコードを使用します。

b = (byte) 128; 
int i = b & 0xff; 
System.out.println(b); 
System.out.println(i); 

-128128を与えます。

次:ASCIIは0から127までの値に対してのみ定義されています。これは、慎重に扱わない限り、> 127は何ものでもないことを意味します。

コードの出力を読み取るときに問題が発生します。 ASCIIは値> 127を含むことができないので、読み込みコードは何をすべきですか?

"output.js"は、ウェブブラウザを使用してこのデータをJavaScriptファイルとして読み取っているようです。 Webブラウザは、 "エンコーディング"を使用してバイトストリームをテキストに変換しようとします。あなたは1つを指定しないで、ブラウザは推測をして間違ってしまう(そして、application/octet-streamも間違っているように見える。それはtext/javascriptでなければならない?)。

あなたは2つのオプションがあります。通常である(適切にエンコードされたUTF-8文字列を返します(UTF-8にはバイトとしてUnicodeを送信する方法である)とUTF-8に文字セットを設定する

  1. 変更encode()をデフォルトより良い後悔するより安全である):

    response.setHeader("Content-Type", "text/javascript; charset=UTF-8"); 
    
  2. はバイト1が保持されますISO-8859-1に文字セットを設定します:1。スクリプトに255以上のUnicode文字が含まれていると、これは失敗します。エラーは発生しないため、ではなくにこの方法を使用する必要があります。私は完全性のためにそれを言います。

1

あなたのアプリケーションがこの日および年齢でとても厳しいメモリ要件を持っていることを信じるのは難しいです。

任意の更なるあなたの動機に疑問をせずに、ここにあなたが何ができるかです:

byte[] result=encode(req.getParameter("originalScript")); 
char[] tmp = new char[result.length]; 
for (int i = 0 ; i != result.length ; i++) { 
    tmp[i] = (char)(result[i] & 0xFF); 
} 
os.print(new String(tmp)); 
関連する問題