ホームページ >Java >&#&ベース >JavaのExcelでエクスポートされた文字化けしたコードの解決策

JavaのExcelでエクスポートされた文字化けしたコードの解決策

尚
オリジナル
2019-12-05 10:41:513645ブラウズ

JavaのExcelでエクスポートされた文字化けしたコードの解決策

間違った方法:

response.setHeader("Content-Disposition", "inline;filename="+ new String(fileName.getBytes(),"utf-8"));
String fileName =    aicaseNodeDeptService.getFilename(request)+".xlsx";
response.setCharacterEncoding("UTF-8");
response.setContentType("application/ms-excel");

正しい方法

response.setHeader("Content-Disposition","inline;filename="+new String(fileName.getBytes("utf-8"),"iso8859-1"));

理由: httpheader では、これらの文字を渡す前にコンテンツが iso8859-1 でエンコードされている必要があります。宛先では、宛先プログラムは逆のメソッド Strings_utf8 = newString(s_iso88591.getBytes("ISO8859-1"), "UTF-8") を使用して正しい漢字「中」を取得するため、コンプライアンスが保証されます。もサポートされています。

Java では、String の getBytes() メソッドは、オペレーティング システムのデフォルトのエンコード形式でバイト配列を取得します。これは、オペレーティング システムが異なると、返される内容が異なることを意味します!

String.getBytes(Stringdecode) メソッドは、次のように、指定されたデコード エンコーディングに従ってエンコーディングで特定の文字列のバイト配列表現を返します。

byte[] b_gbk = "中".getBytes("GBK");
byte[] b_utf8 = "中".getBytes("UTF-8");
byte[] b_iso88591 = "中".getBytes("ISO8859-1");

は、GBK、UTF-8、ISO8859-1 エンコーディングでそれぞれ漢字「中」のバイト配列表現を返します。このとき、

b_gbk の長さは 2、

b_utf8 の長さは 3、

#b_iso88591 の長さは 1 です。

getBytes と比較すると、new String(byte[], decode) を通じて「中」文字を復元できます。

この new String(byte[], decode) は、実際には指定された文字列を使用します。

String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");

s_gbk、s_utf8、s_iso88591 を出力すると、s_gbk と s_utf8 は両方とも「中」であり、s_iso88591 だけが認識されない文字であることがわかります (理解できます)。文字化けとして)、ISO8859-1 エンコードと再結合を使用した後、単語「中」を復元できないのはなぜですか?

理由は非常に単純で、ISO8859-1エンコードのエンコードテーブルには漢字が全く含まれていないためです。もちろん、「中」.getBytes("で正しい「中」を取得することは不可能です。 ISO8859-1"); ISO8859-1 でエンコードされた単語の値であるため、newString() を通じて復元することは不可能です。

したがって、String.getBytes(Stringdecode) メソッドを通じて byte[] を取得するときは、String で表されるコード値がデコード エンコード テーブルに実際に存在することを確認する必要があります。正しく復元できます。

Java についてさらに詳しく知りたい場合は、

Java 基本チュートリアル 列に注目してください。

注:

中国語の文字を特定の特殊な要件 (コンテンツが ISO8859-1 でエンコードされている必要がある http ヘッダーなど) に適合させるために、中国語の文字がバイト単位でエンコードされる場合があります。形式:

String s_iso88591 = newString("中".getBytes("UTF-8"),"ISO8859-1") のように状況をエンコードするには、この方法で取得した s_iso8859-1 文字列は次のようになります。 ISO8859-1 の文字の場合、これらの文字を宛先に渡した後、宛先プログラムは反対のメソッド Strings_utf8 = newString(s_iso88591.getBytes("ISO8859-1"), "UTF-8") を使用して正しい文字列を取得します。漢字「中」は、協定の遵守を保証するだけでなく、中国語をサポートします。

以上がJavaのExcelでエクスポートされた文字化けしたコードの解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。