現在、XSLT を使用して CSV エクスポートを開発しています。また、私の場合、CSV ファイルは 99 パーセント Excel で使用されるため、Excel の動作を考慮する必要があります。
最初の問題は、CSV 内のドイツ語の特殊文字でした。CSV エンコードが UTF8 であるにもかかわらず、Excel は UTF8 の CSV ファイルを正しく開くことができません。特殊文字が奇妙な記号になります。この問題の解決策を見つけました。3 バイト追加しただけです(EF BB BF- 別名 BOM ヘッダー) コンテンツ バイトの先頭です。UTF8 BOM は、Excel に対して「これは UTF8 なので、正しく開いてください」と伝える手段です。これで問題は解決です。
2 つ目の問題は区切り文字に関するものでした。デフォルトの区切り文字は、地域によってコンマまたはセミコロンになります。ドイツではセミコロン、イギリスではコンマだと思います。そのため、この問題を防ぐには、以下の行を追加する必要がありました。
<xsl:text>sep=;</xsl:text>
または
<xsl:text>sep=,</xsl:text>
(このセパレータはハードコードとして実装されていません)
しかし、解決策が見つからない私の問題は、CSV ファイルが UT8-BOM で生成されているときにファイルの先頭に「sep=;」または「sep=」を追加すると、BOM が特殊文字を適切に表示しなくなることです。また、BOM バイトは常にバイト配列の先頭にあると確信しています。このスクリーンショットは、Mac OS X の MS Excel からのものです。
最初の 3 つのシンボルは BOM ヘッダーに属します。
このような問題に遭遇したことがありますか、または何か提案はありますか? ありがとうございます。
編集:
プリントスクリーンを共有します。
a. BOMと <xsl:text>sep=;</xsl:text>
b. BOMのみ
Java コード:
// Write the bytes
ServletOutputStream out = resp.getOutputStream();
if(contentType.toString().equals("CSV")) {
// The additional bytes in below is prefix indicates that the content is in UTF-8.
out.write(239);
out.write(187);
out.write(191);
}
out.write(bytes); // Content bytes, in this case XSL
XSL コード:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:text>sep=;</xsl:text>
<table>
...
</table>
</xsl:template>
ベストアンサー1
おっしゃる通り、Excel 2007 では、CSV ファイルをダブルクリックしたときに、異なるロケール間でエンコードと区切り文字の両方を正しく読み込む方法はありません。
sep=
BOM の後に指定すると、BOM が UTF-8 であると伝えたことを忘れてしまうようです。
特定のロケールでは Excel が区切り文字を検出しないため、BOM を指定する必要があります。たとえば、デンマーク語の場合、デフォルトの区切り文字は です;
。タブまたはカンマで区切られたテキストを出力すると区切り文字が検出されず、他のロケールではセミコロンで区切ると読み込まれません。Windows 設定でロケール形式を変更することでこれをテストできます。Excel はこれを取得します。
この質問から:Excel に UTF-8 CSV ファイルを自動的に認識させることは可能ですか?
そして答えは、唯一の方法はUTF-16 LEエンコーディングBOM付き。
また、http://wiki.scn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator?original_fqdn=wiki.sdn.sap.comタブ区切りの utf16-le を使用すると動作するようです。
Excel が CSV テキストを取得するメソッドを読み取って再度呼び出し、BOM が失われるのではないかと疑問に思いました。間違ったテキストを指定してみましたが、Excel にとエンコードのsep=;
両方を取得するように指示する回避策が見つかりません。sep