UTF-8、BOMなしの外部文字を含むCSVファイルをエクスポートするWebアプリがあります。 WindowsユーザーとMacユーザーの両方がExcelで文字化けを起こします。 BOMでUTF-8に変換してみました。 Excel/Winはそれで問題ありませんが、Excel/Macは意味不明です。 Excel 2003/Win、Excel 2011/Macを使用しています。私が試したすべてのエンコーディングは次のとおりです。
Encoding BOM Win Mac
-------- --- ---------------------------- ------------
utf-8 -- scrambled scrambled
utf-8 BOM WORKS scrambled
utf-16 -- file not recognized file not recognized
utf-16 BOM file not recognized Chinese gibberish
utf-16LE -- file not recognized file not recognized
utf-16LE BOM characters OK, same as Win
row data all in first field
最良の方法はBOMを使用したUTF-16LEですが、CSVはそのように認識されません。フィールド区切り文字はコンマですが、セミコロンは変更しません。
両方の世界で機能するエンコーディングはありますか?
ローダウンは次のとおりです。解決策はありません。 Excel 2011/Macは、エンコードやフープのジャンプに関係なく、ウムラウトや発音区別符号を含むCSVファイルを正しく解釈できません。誰かが私に違うことを言うのを聞いてうれしいです!
Excelを扱うとき、WINDOWS-1252
エンコーディングが最もイライラしないことがわかりました。基本的にマイクロソフトが独自の文字セットを所有しているため、MS-ExcelのMacバージョンとWindowsバージョンの両方で動作すると想定できます。両方のバージョンには、少なくとも、データを正しく読み取る「File Origin」または「File encoding」セレクターが含まれています。
システムと使用するツールに応じて、このエンコーディングは、CP1252
、ANSI
、Windows (ANSI)
、MS-ANSI
、または単にWindows
などのバリエーションもあります。 。
このエンコードはISO-8859-1
(別名LATIN1
など)のスーパーセットであるため、何らかの理由でISO-8859-1
を使用できない場合は、WINDOWS-1252
にフォールバックできます。以下に示すように、ISO-8859-1
からWINDOWS-1252
の一部の文字が欠落していることに注意してください。
| Char | ANSI | Unicode | ANSI Hex | Unicode Hex | HTML entity | Unicode Name | Unicode Range |
| € | 128 | 8364 | 0x80 | U+20AC | € | euro sign | Currency Symbols |
| ‚ | 130 | 8218 | 0x82 | U+201A | ‚ | single low-9 quotation mark | General Punctuation |
| ƒ | 131 | 402 | 0x83 | U+0192 | ƒ | Latin small letter f with hook | Latin Extended-B |
| „ | 132 | 8222 | 0x84 | U+201E | „ | double low-9 quotation mark | General Punctuation |
| … | 133 | 8230 | 0x85 | U+2026 | … | horizontal Ellipsis | General Punctuation |
| † | 134 | 8224 | 0x86 | U+2020 | † | dagger | General Punctuation |
| ‡ | 135 | 8225 | 0x87 | U+2021 | ‡ | double dagger | General Punctuation |
| ˆ | 136 | 710 | 0x88 | U+02C6 | ˆ | modifier letter circumflex accent | Spacing Modifier Letters |
| ‰ | 137 | 8240 | 0x89 | U+2030 | ‰ | per mille sign | General Punctuation |
| Š | 138 | 352 | 0x8A | U+0160 | Š | Latin capital letter S with caron | Latin Extended-A |
| ‹ | 139 | 8249 | 0x8B | U+2039 | ‹ | single left-pointing angle quotation mark | General Punctuation |
| Œ | 140 | 338 | 0x8C | U+0152 | Œ | Latin capital ligature OE | Latin Extended-A |
| Ž | 142 | 381 | 0x8E | U+017D | | Latin capital letter Z with caron | Latin Extended-A |
| ‘ | 145 | 8216 | 0x91 | U+2018 | ‘ | left single quotation mark | General Punctuation |
| ’ | 146 | 8217 | 0x92 | U+2019 | ’ | right single quotation mark | General Punctuation |
| “ | 147 | 8220 | 0x93 | U+201C | “ | left double quotation mark | General Punctuation |
| ” | 148 | 8221 | 0x94 | U+201D | ” | right double quotation mark | General Punctuation |
| • | 149 | 8226 | 0x95 | U+2022 | • | bullet | General Punctuation |
| – | 150 | 8211 | 0x96 | U+2013 | – | en dash | General Punctuation |
| — | 151 | 8212 | 0x97 | U+2014 | — | em dash | General Punctuation |
| ˜ | 152 | 732 | 0x98 | U+02DC | ˜ | small tilde | Spacing Modifier Letters |
| ™ | 153 | 8482 | 0x99 | U+2122 | ™ | trade mark sign | Letterlike Symbols |
| š | 154 | 353 | 0x9A | U+0161 | š | Latin small letter s with caron | Latin Extended-A |
| › | 155 | 8250 | 0x9B | U+203A | › | single right-pointing angle quotation mark | General Punctuation |
| œ | 156 | 339 | 0x9C | U+0153 | œ | Latin small ligature oe | Latin Extended-A |
| ž | 158 | 382 | 0x9E | U+017E | | Latin small letter z with caron | Latin Extended-A |
| Ÿ | 159 | 376 | 0x9F | U+0178 | Ÿ | Latin capital letter Y with diaeresis | Latin Extended-A |
ユーロ記号が欠落していることに注意してください。このテーブルは Alan Wood にあります。
変換は、ツールと言語ごとに異なります。ただし、query_result.csv
エンコードされていることがわかっているファイルUTF-8
があるとします。 iconv
を使用してWINDOWS-1252
に変換します。
iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
BOMを使用したUTF-16LEの場合、コンマではなくタブ文字を区切り文字として使用すると、Excelはフィールドを認識します。これが機能する理由は、Excelが実際にはUnicode * .txtパーサーを使用することになるからです。
警告:ファイルをExcelで編集して保存すると、タブ区切りASCIIとして保存されます。問題は、ファイルを再度開くと、Excelが実際のCSV(コンマ付き)であると見なし、Unicodeではないため、コンマ区切りとして解析するため、ハッシュが作成されるということです。
更新:上記の警告は、少なくとも今日のExcel 2010(Windows)では私には起きていないように見えますが、次の場合には保存動作に違いがあるように見えます:
に比べ:
カンマ区切りおよびセミコロン区切りのCSVのみを試しました。タブ区切りのCSV(TSVとも呼ばれます)を試した場合、答えが見つかります。
TF-16LE with BOM(byte order mark)、tab-separated
ただし:コメントで、TSVはあなたにとって選択肢ではないことを述べています(質問でこの要件を見つけることができませんでした)。それは残念だ。多くの場合、TSVファイルの手動編集を許可することを意味しますが、これはおそらく良い考えではありません。 TSVファイルの視覚的なチェックは問題ではありません。さらに、タブをマークするための特殊文字を表示するようにエディターを設定できます。
そして、はい、WindowsとMacでこれを試しました。
MacでUTF-8を使用してCSVファイルを読み取るための最善の回避策は、それらをXLSX形式に変換することです。 Konrad Foerstnerが作成したスクリプトを見つけました。さまざまな区切り文字のサポートを追加することで、スクリプトを少し改善しました。
Githubからスクリプトをダウンロードします https://github.com/brablc/clit/blob/master/csv2xlsx.py 。実行するには、Excelファイル操作用のpythonモジュールopenpyxlをインストールする必要があります:Sudo easy_install openpyxl
。
以下は、utf8でエンコードされたCSVをExcel for Macにインポートする際の決まり文句です。Microsoftは、「Excel for Macは現在UTF-8をサポートしていません。」 Excel for Mac 2011およびUTF-8
はい、MSに行く方法です!
私の考えでは、Mac OS用のExcel 2011はEncoding.GetEncoding( "10000")を使用していないようで、Microsoft OSと同じisoで2日間無駄にしました。これに対する最善の証拠は、Excel 2011でMAC用の特別な文字を含むファイルを作成し、CSVとして保存してからMACテキストエディターで開くと、文字がスクランブルされることです。
私にとってこのアプローチはうまくいきました-つまり、MAC OS上のExcel 2011のcsvエクスポートには、特別な西ヨーロッパの文字が含まれています:
Encoding isoMacOS = Encoding.GetEncoding("iso-8859-1");
Encoding defaultEncoding = Encoding.Default;
// Convert the string into a byte array.
byte[] defaultEncodingBytes = defaultEncoding.GetBytes(exportText);
// Perform the conversion from one encoding to the other.
byte[] ansiBytes = Encoding.Convert(defaultEncoding, isoMacOS, defaultEncodingBytes);
decodedString = isoMacOS.GetString(ansiBytes);
現在、BOMなしのUTF-8はExcel Mac 2011 14.3.2で機能します。
UTF-8 + BOMの種類の作品ですが、BOMはちらつきとしてレンダリングされます。
UTF-16は、ファイルをインポートしてウィザードを完了すると機能しますが、ダブルクリックするだけでは機能しません。
私の場合、これは機能しました(Mac、Excel 2011、キリル文字とラテン文字、チェコ語の発音区別記号):
以下は、Excel for Mac 2011およびWindows Excel 2002で機能しました。
Macでiconvを使用して、ファイルをUTF-16リトルエンディアンに変換し、*。txtという名前を付けます(拡張子が.txtの場合、Excelはテキストインポートウィザードを実行します)。
iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt
Excelでファイルを開き、テキストインポートWizardで以下を選択します。
PS iconvによって作成されたUTF-16LEの先頭にはBOMバイトFF FEがあります。
PPS私のオリジナルのcsvファイルはWindows 7コンピューターでUTF-8形式で作成され(先頭にBOMバイトEF BB BFがあります)、CRLF改行を使用しました。コンマはフィールド区切り文字として使用され、単一引用符はテキスト修飾子として使用されました。 ASCII文字に加えて、チルダ、ウムラウトなどのラテン文字、キリル文字が含まれていました。 Excel for WinとMacの両方ですべてが正しく表示されました。
PPPS Exactソフトウェアバージョン:
* Mac OS X 10.6.8
* Excel for Mac 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625
私のMac OSでは、Text WranglerはExcelで作成されたCSVファイルが「Western」エンコーディングを持っていると識別しました。
いくつかのグーグルの後に、私はこの小さなスクリプトを作成しました(Windowsの可用性についてはわかりません。おそらく Cygwin ?で)。
$ cat /usr/local/bin/utf8.sh
#!/bin/bash
INPUTFILE="$1"
iconv -f macroman -c -t UTF-8 $INPUTFILE |tr '\r' '\n' >/tmp/file.$$.csv
mv $INPUTFILE ms_trash
mv /tmp/file.$$.csv $INPUTFILE
私の場合、ファイルにプリアンブルを追加すると問題が解決しました。
var data = Encoding.UTF8.GetBytes(csv);
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(new MemoryStream(result), "application/octet-stream", "data.csv");
これは私のために働く
ここで重要な点は、File OriginとしてMacintoshを選択することです(最初の選択である必要があります)。
これはExcel 2011(バージョン14.4.2)を使用しています
*ウィンドウの下部に小さなドロップダウンがあります
csvの代わりに、XLS拡張機能と「application/Excel」mime-typeを使用してhtmlを出力しようとします。これはWindowsでも機能することはわかっていますが、MacOSの代弁はできません
Java(BOM付きUTF-16LE)を使用してこれを解決します。
String csvReportStr = getCsvReport();
byte[] data = Charset.forName("UTF-16LE").encode(csvReportStr)
.put(0, (byte) 0xFF)
.put(1, (byte) 0xFE)
.array();
CSVファイルではTAB
を区切り文字として使用する必要があることに注意してください。 CSVファイルは、WindowsとMAC OS Xの両方で読むことができます。