MacとWindowsの両方のExcelでCSVファイルを正しく開くエンコーディングはどれですか?


137

BOMなしで、UTF-8の外部文字を含む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はそのように認識されません。フィールド区切り文字はカンマですが、セミコロンは変更しません。

両方の世界で機能するエンコーディングはありますか?


1
すべてのフィールドデータにUTF-16LEを使用し、コンマに8ビット/ ASCII文字を使用するとどうなりますか?この記事(creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings)に基づいて、ExcelはUnicodeのコンマを区切り記号ではなくフィールドデータの一部として解釈している場合があります。
jveazey 2011

1
興味深いヒント@jveazey。私はこれを試してみましょう:mb_convert_encoding($str, "UTF-16LE");エクスポートコードで結果をここに投稿します。
Timm

これは役に立ちませんが、Excel 2007 SP2をWindowsでテストしました(メモ帳2を使用してテストファイルを作成)。UTF-16LE BOM(Windowsでの結果と同じ結果)とUTF-16BE BOM(フィールドを正しく解析しましたが、BOMはA1の最初の2文字として含まれていました)以外はすべて機能しました。
jveazey 2011


@hveazey、引用された質問には、コードページWindows-1252を不気味に推奨することによる回答があります。それは私の場合にはうまくいきませんでした(ドイツ語のウムラウトとシャープs)。
Timm

回答:


61

Excelエンコーディング

私は、WINDOWS-1252Excelを処理するときにエンコーディングが最も苛立たしいことがわかりました。基本的にMicrosoft独自の独自の文字セットであるため、MS-ExcelのMac版とWindows版の両方で動作すると想定できます。どちらのバージョンにも、少なくともデータを正しく読み取る、対応する「ファイルオリジン」または「ファイルエンコーディング」セレクタが含まれています。

お使いのシステムと使用するツールによっては、このエンコーディングにも名前を付けることができCP1252ANSIWindows (ANSI)MS-ANSIまたは単にWindows、他のバリエーションの中で。

このエンコーディングはISO-8859-1(別名LATIN1など)のスーパーセットであるため、何らかの理由でISO-8859-1使用できない場合はフォールバックできますWINDOWS-1252。ここに示さISO-8859-1WINDOWS-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。それをWINDOWS-1252使用するように変換しiconvます:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv

6
少しおかしなことですが、これはヨーロッパ言語の文字を含む.csvファイルをMac OSX上のExcelにインポートするための答えのようです
Fergie

1
そうだね。代わりにOPの質問に答えます。あなたの場合、最初に「ヨーロッパ文字を含む.csvファイル」で使用されているエンコーディングを知る(または推測する)必要があります。次にWINDOS-1252、に変換できます。これは、おそらくMacとWindows Excelの両方で正しく解釈されます。
mikezter 2014年

1
これは実際の解決策ではありません。遅かれ早かれ、WINDOWS-1252に変換できない文字に遭遇します。
Walter Tross 2015年

2
漢字がある場合、WINDOWS-1252は失敗します。したがって、BOM付きのUTF-16LEが唯一のオプションのようです。
-XWang

これは、発音区別符号を使用したSQLデータのエクスポートに適しています。
motorbaby 2016年

26

BOMを使用したUTF-16LEの場合、区切り文字としてコンマの代わりにタブ文字を使用すると、Excelはフィールドを認識します。これが機能する理由は、Excelが実際にはUnicode * .txtパーサーを使用することになるためです。

警告:ファイルをExcelで編集して保存すると、タブ区切りのASCIIとして保存されます。ここでの問題は、ファイルを再度開くと、Excelが実際のCSV(コンマを含む)であると見なし、それがUnicodeではないことがわかるため、コンマ区切りとして解析されるため、ハッシュが作成されます。

更新:上記の警告は、少なくとも今日のExcel 2010(Windows)では発生していないようですが、次の場合の保存動作には違いがあるようです。

  • Excelを編集して終了します( 'Unicode * .txt'として保存しようとします)

に比べ:

  • ファイルのみを編集して閉じる(期待どおりに動作します)。

1
いいですが、警告は私にとっての解決策を打破します。エンドユーザーはExcelシートの破損に満足できません。
Timm

おそらく、最初のファイル拡張子を* .txtに変更すると機能しますが、ファイルタイプとExcelの間の関連付けが失われます。つまり、ファイルをダブルクリックしてExcelで自動的に開くことができません。
Duncan Smart

それは私にはうまくいきません。コンピューターに精通していないため、エンドユーザーはハードウェアなしでExcelで開く必要があります。
Timm

「.csv」Excelシートに、特殊文字と区切られたフィールドが見栄えしました。出力文字列をバイトオーダーマーク(BOM)として「\ ufeff」で開始し、フィールド分離のためにカンマの代わりに「\ t」タブを使用し、「utf-16LE」でファイルをエンコードします。このページのおかげで、魅力のように機能します!
オタク株

最初の行sep=,とUTF16LEエンコーディングは私にとってはうまくいき、別の区切り文字を必要としませんでした(コンマのままでした)。ダブルクリックでファイルを開くと、ファイルが正しく読み込まれ、セル内の特殊文字や改行はそのまま残ります。欠点:sep=,ヘッダーは、Excel以外のプログラムでは認識されません。しかし、OpenOffice / LibreOfficeはこのハックを必要としません(セルコンテンツの改行は問題なく機能しますが、テキストファイルからのロード/ Excelの列アシスタントテキストへの使用はセルの改行を適切に処理しません)。
CodeManX 2017年

24

ローダウンは:解決策はありません。Excel 2011 / Macは、エンコードまたはフープジャンプの種類に関係なく、ウムラウトと発音区別符号を含むCSVファイルを正しく解釈できません。誰かが私に別のことを言うのを聞いてうれしいです!


4
WIN-1252またはISO-8859-1エンコーディングが機能していることがわかりました。私の答えを見てください。
mikezter 2013年

3
解決策は、UTF-16LEを使用し、コンマではなくタブを使用して列を区切ることです。
Tim Groeneveld、2014

あなたは本当にこれをWinとMac Timで試しましたか?前述のとおり、私の場合はTSVはオプションではありません。
ティム

1
私にとっては、ExcelのMacバージョンとWindowsバージョンの両方でWIN-1252エンコーディングを使用している場合、エクスポートは正常に機能します。@ティム、あなたは受け入れられた答えを変えることを考慮すべきです。
Pierre Arnaud、2014年

2
これが機能していることを発見した人にとって、データセットに実際に拡張文字(中国語など)が含まれていましたか?WIN-1252エンコーディングは範囲外であるため、これらのエンコーディングは機能しません。
ビルリーパー、2014

11

カンマ区切りとセミコロン区切りのCSVのみを試しました。タブ区切りのCSV(TSVとも呼ばれます)を試した場合は、答えが見つかります。

BOM(バイトオーダーマーク)付きUTF-16LEタブ区切り


しかし:コメントで、TSVはオプションではないと述べています(ただし、質問でこの要件を見つけることができませんでした)。それは残念だ。多くの場合、TSVファイルの手動編集を許可することを意味しますが、これはおそらく良い考えではありません。TSVファイルの目視チェックは問題ではありません。さらに、タブをマークするための特殊文字を表示するようにエディターを設定できます。

はい、WindowsとMacで試してみました。



4

MacでUTF-8を使用してCSVファイルを読み取るための最良の回避策は、それらをXLSX形式に変換することです。Konrad Foerstnerによって作成されたスクリプトを見つけました。このスクリプトは、さまざまな区切り文字のサポートを追加することで少し改善されています。

Github https://github.com/brablc/clit/blob/master/csv2xlsx.pyからスクリプトをダウンロードします。これを実行するには、Excelファイル操作用のPythonモジュールopenpyxlをインストールする必要がありますsudo easy_install openpyxl


3

私の場合、これはうまくいきました(Mac、Excel 2011、チェコ語の発音区別符号付きのキリル文字とラテン文字の両方):

  • Charset UTF-16LE(単にUTF-16では不十分でした)
  • BOM「\ xFF \ xFE」
  • セパレーターとしての\ t(タブ)
  • セパレータとCRLFもエンコードすることを忘れないでください:-)
  • mb_convert_encodingの代わりにiconvを使用

2

Excel 2011 for Mac OSが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);

@ user525081はどの言語を使用していますか?PHPに変換できますか?
Timm、

@TimmはJavaサンプルのように見えますが、PHPではiconvを使用して変換を実行できます-de3.php.net/manual/en/function.iconv.php
Ashish Datta

OK @ user525081、他の回答と同じ取引。これはMacユーザーに対応し、Windowsの人々をとりこにしてしまいます。そして、それは元の質問に答えません-両方のプラットフォームで動作するエンコーディング。ありがとう。
ティム

2

BOMなしのUTF-8は、現在Excel Mac 2011 14.3.2で動作します。

UTF-8 + BOMのような作品ですが、BOMは意味不明なものとしてレンダリングされます。

UTF-16は、ファイルをインポートしてウィザードを完了すると機能しますが、ダブルクリックするだけでは機能しません。


2

Excel for Mac 2011とWindows Excel 2002では、以下が機能しました。

  1. Macでiconvを使用して、ファイルをUTF-16リトルエンディアン+名前に* .txtに変換します(.txt拡張子はExcelにテキストインポートウィザードを強制的に実行させます):

    iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt

  2. Excelでファイルを開き、テキストインポートウィザードで次を選択します。

    • ステップ1:ファイルのオリジン:無視してください。何を選択してもかまいません
    • ステップ2:区切り文字テキスト修飾子に適切な値を選択する
    • ステップ3:必要に応じて、列のフォーマットを選択する

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


BOMのないUTF-8ファイルがある場合、iconvはそれをBOMのない UTF-16LEに変換します(残念ながら、iconvにファイルを追加するよう指示する方法はありません)
Walter Tross

2

私のMac OSでは、Text WranglerがExcelで作成されたCSVファイルを「Western」エンコーディングであると識別しました。

いくつかグーグルした後、私はこの小さなスクリプトを作成しました(おそらくCygwinで Windowsが利用可能かどうかはわかりません):

$ 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

OS X 10.14.2(およびExcel 2011)で動作したのはこれだけです
ドナルド

1

私の場合、ファイルにプリアンブルを追加すると問題が解決しました:

var data = Encoding.UTF8.GetBytes(csv);
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(new MemoryStream(result), "application/octet-stream", "data.csv");

0

csvの代わりに、XLS拡張子と "application / excel" MIMEタイプでhtmlを出力してみます。私はこれがWindowsで機能することを知っていますが、MacOSについて話すことはできません


@ royce23に感謝しますが、CSVファイルをダウンロード用に提供しています。マークアップのサイズが非常に大きいとクロールへの応答が遅くなるため、HTTPで表示することはできません。エクスポートされたテーブルには数百万の行が含まれる場合があります...
Timm

cssを使用すると、htmlはcsvよりもほんのわずかな部分になります。例:<r> <c> id </ c> <c> name </ c> <c> phone </ c> </ r>
royce3

理解できたかどうかわかりませんが、CSVをサーバーに保存し、ダウンロードリンクを提供しています。HTML応答を生成すると、PHPメモリが大量に消費されます...
Timm

これは機能します(UTF-8文字)が、セル(brタグ)内に改行が埋め込まれている場合、Excel for Macは(Windowsで機能する)CSSを無視します mso-data-placement:same-cell;
クロップドレッド

0

これは私のために働く

  1. BBEditまたはTextWrangler *でファイルを開きます。
  2. ファイルをUnicode(UTF-16リトルエンディアン)として設定します(行末はUnixまたはWindowsにすることができます)。保存する!
  3. Excelの場合:データ>外部データの取得>テキストファイルのインポート...

ここで重要なのは、ファイルの起点としてMacIntoshを選択することです(これが最初の選択です)。

これはExcel 2011(バージョン14.4.2)を使用しています

*ウィンドウの下部に小さなドロップダウンがあります


0

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の両方で読み取ることができます。

参照:BOMでUTF-16LEバイト配列をエンコード/デコードするにはどうすればよいですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.