142

BOMなしでUTF-8を使用して外国文字を含むCSVファイルをエクスポートするWebアプリがあります。WindowsとMacの両方のユーザーがExcelでガベージ文字を取得します。BOMを使用してUTF-8に変換してみました。Excel / Winはそれで問題ありません、Excel/Macはぎこちないことを示します。私はExcel2003/ 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はそのように認識されません。フィールド区切り文字はコンマですが、セミコロンは変更しません。

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

4

15 に答える 15

62

Excelエンコーディング

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

システムと使用するツールに応じて、このエンコーディングには、、、、、または単に、などのバリエーションの名前CP1252を付けることもできます。ANSIWindows (ANSI)MS-ANSIWindows

このエンコーディングはISO-8859-1(akaLATIN1など)のスーパーセットであるため、何らかの理由で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         |

ユーロ記号が欠落していることに注意してください。この表はAlanWoodにあります。

変換

変換は、ツールや言語ごとに異なる方法で行われます。ただし、エンコードされquery_result.csvていることがわかっているファイルがあるとします。使用UTF-8に変換します:WINDOWS-1252iconv

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
于 2013-11-25T13:25:54.807 に答える
27

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

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

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

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

に比べ:

  • ファイルだけを編集して閉じます(期待どおりに機能します)。
于 2012-01-28T00:08:46.787 に答える
24

結論は次のとおりです。解決策はありません。Excel 2011 / Macは、エンコードやフープジャンプを行っても、ウムラウトと発音区別符号を含むCSVファイルを正しく解釈できません。誰かが私に違うことを言うのを聞いてうれしいです!

于 2012-01-30T21:06:50.403 に答える
12

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

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


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

そして、はい、私はこれをWindowsとMacで試しました。

于 2015-03-13T15:44:15.190 に答える
4

utf8でエンコードされたCSVをExcel2011forMacにインポートする際のクリンチャーは次のとおりです。Microsoftは次のように述べています。「ExcelforMacは現在UTF-8をサポートしていません。」Excel forMac2011およびUTF-8

はい、MSに行く方法です!

于 2013-02-18T18:54:38.473 に答える
4

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

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

于 2013-06-29T23:08:58.200 に答える
3

私の場合、これは機能しました(Mac、Excel 2011、チェコ語の発音区別符号を使用したキリル文字とラテン文字の両方):

  • 文字セットUTF-16LE(単にUTF-16では不十分でした)
  • BOM "\ xFF \ xFE"
  • セパレータとしての\t(タブ)
  • セパレーターとCRLFもエンコードすることを忘れないでください:-)
  • mb_convert_encodingの代わりにiconvを使用してください
于 2014-09-27T10:41:54.473 に答える
2

私の場合、MacOS用のExcel2011は、私が思っていたようにEncoding.GetEncoding( "10000")を使用しておらず、MicrosoftOSと同じISOで2日間無駄になっているようです。これを最もよく証明するのは、Excel 2011でMAC用の特別な文字を含むファイルを作成し、CSVとして保存してから、MACテキストエディターで開くと、文字がスクランブルされます。

私にとって、このアプローチは機能しました。つまり、MACOS上のExcel2011での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);
于 2011-10-14T12:05:18.390 に答える
2

現在、BOMのないUTF-8は、Excel Mac201114.3.2で機能します。

UTF-8 + BOMのような作品ですが、BOMはぎこちないものとしてレンダリングされます。

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

于 2013-04-01T20:56:59.107 に答える
2

私のMacOSでは、TextWranglerは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
于 2014-06-21T16:23:39.260 に答える
2

以下は、Excel forMac2011およびWindowsExcel2002で機能しました。

  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バイトFFFEがあります。

PPS私の元のcsvファイルは、Windows 7コンピューターでUTF-8形式(最初にBOMバイトEF BB BFを使用)で作成され、CRLF改行を使用していました。カンマはフィールド区切り文字として使用され、一重引用符はテキスト修飾子として使用されました。ASCII文字に加えて、チルダ、ウムラウトなどのさまざまなラテン文字に加えて、キリル文字が含まれていました。すべてがExcelforWinと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

于 2014-12-29T21:52:42.577 に答える
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");
于 2017-09-06T13:22:13.967 に答える
0

csvの代わりに、XLS拡張子と「application/excel」mime-typeを使用してhtmlを出力してみてください。これはWindowsで機能することはわかっていますが、MacOSでは話せません

于 2011-08-08T20:36:10.440 に答える
0

これは私のために働く

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

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

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

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

于 2014-08-29T05:33:58.673 に答える
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();

TABCSVファイルは区切り文字として使用する必要があることに注意してください。CSVファイルはWindowsとMACOSXの両方で読み取ることができます。

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

于 2017-04-01T02:14:59.037 に答える