調べて分かる道具箱

CSV の文字化けを直す・変換する

CSV・TSV ファイルをここに置くか、えらぶ50 MB まで。ファイルは端末の中だけで読みます

まだえらんでいません

Shift_JISBOM なしカンマ

mihon.csv159 バイト4 行

読んだ中身の先頭 4 行(全 4 行)
1名前ふりがな年齢住所
2山田 太郎やまだ たろう12東京都千代田区
3佐藤 花子さとう はなこ11大阪府大阪市,北区
4鈴木 一郎すずき いちろう13北海道札幌市
形
文字コード
改行

ファイルは端末の中だけで読みます。判定はブラウザの復号器(WHATWG Encoding Standard(新しいタブで開きます))、BOM は EF BB BF(Unicode の FAQ(新しいタブで開きます))。CSV の引用符は RFC 4180、JSON は RFC 8259、xlsx の zip は PKWARE APPNOTE のとおり。

やってみる

1問目 / 全5問

CSV を開いたら「縺薙s縺ォ縺。縺ッ」のように化けていました。何が起きていますか?

CSV ファイルを置くと、文字コードを判定して表で見せ、Excel で開ける形(UTF-8・BOM 付き)で返します。 TSV・JSON・Excel(xlsx)・Markdown・HTML にも変換できます。

この道具がやること

置かれたファイルのバイトを読んで文字コードを当て、表にして見せます。

保存を押すと、先頭に BOM を付けた UTF-8 になります。Excel の取り込みは、この印で UTF-8 と分かります(Microsoft Learn)。

なぜ化けるのか

文字はバイトの並びで保存されます。同じバイトでも、 読むときの表が違うと別の字になります。

「あ」の 3 バイトを Shift_JIS の表で読むと、2 バイトで 1 字・残り 1 バイトは読めずに「�」。

BOM は「UTF-8 の目印」

ファイルの先頭に置く EF BB BF の 3 バイトが BOM です。字にはならず、 「この先は UTF-8」という印になります(Unicode の FAQ)。

Excel の取り込みは、UTF-8 をこの印があるときだけ UTF-8 と見ます(Microsoft Learn)。

BOM を付ける・外す

Excel で開くなら付ける。プログラムで読むなら外すことがあります ── 先頭に決まった文字を求める形式では、BOM が邪魔になります(Unicode の FAQ)。

保存の形で「BOM あり/なし」を選べます。中身は同じです。

3 つの文字コード

日本語の CSV で出会うのは UTF-8・Shift_JIS・EUC-JP の 3 つ。同じ「あ」でもバイトの並びが全部違います。

上の見本のファイルは Shift_JIS。自分のファイルを置くと、この 3 つのどれかが出ます。

CSV と TSV の違い

ますの区切りがカンマなら CSV、タブなら TSV。中身は同じ表です。

ますの中にカンマがあるときは「"」で囲みます(RFC 4180)。上の道具は区切りを見て判定し、 どちらにも変換します。

xlsx に変換すると zip ができる

Excel の .xlsx の中身は zipで、ますの中身は XML の文字で入っています。拡張子を .zip にすると開けます。

上の道具はその zip を端末の中で組みます(部品は 5 つ)。値は文字のまま入れます。

Windows と Mac の改行

行の終わりの印が、Windows は CR LF(0D 0A)の 2 バイト、Mac・Linux は LF(0A)の 1 バイト。CSV の決まり(RFC 4180)は CRLF です。

変えるのは行の終わりだけ。引用符の中の改行(セルの中の改行)はそのまま残します。

貼るページと、置くページ

文字化け復元は化けた文字を貼るページ。貼った字には、読めなかったバイトが「�」になって残ることがあります。

ここはファイルを置くページ。バイトがそのまま残っているので、失わずに直せます。

よくある質問

CSV の文字化けを直すには?

上の枠に CSV ファイルを置く(か、えらぶ)だけです。文字コードを判定して表で見せ、「Excel で開ける形で保存」を押すと UTF-8(先頭に BOM 付き)のファイルが手元に保存されます。中身の文字は変えず、文字コードだけを変えています。

Excel で開くと文字化けするのはなぜ?

CSV は文字コードを名乗らないファイルだからです。Excel の取り込み(Power Query)について Microsoft Learn は「文字セットは推論されず、UTF-8 は UTF-8 BOM で始まる場合にのみ推論されます」と書いています。BOM の無い UTF-8 の CSV は別の表で読まれて化けます。上の判定に「BOM なし」と出たファイルがそれです。

文字化けしないように開くには?

いちばん簡単なのは、先頭に BOM の付いた UTF-8 にしてから開くことです。この道具の保存がそれをします。もう1つは、Excel の「データ」タブの「テキストまたは CSV から」で取り込み、ファイルの配信元(文字セット)を自分で選ぶ方法です(Microsoft Learn の Power Query Text/CSV コネクタの説明)。

Mac の Excel でも文字化けする

起きることは同じで、ファイルの文字コードと読む側の表が合っていないだけです。この道具はブラウザの中で動くので、Mac でも Windows でも同じ手順で BOM 付き UTF-8 にできます。Excel の取り込みが UTF-8 を BOM で見分けることは、Microsoft Learn の説明のとおりです。

UTF-8 なのに文字化けするのはなぜ?

UTF-8 でも先頭に BOM(EF BB BF)が無いと、読む側は UTF-8 だと分かりません(Microsoft Learn: UTF-8 は BOM で始まる場合にのみ推論される)。Unicode の FAQ も、先頭の BOM は「印の無いテキストが UTF-8 であることを示す署名」として使うと書いています。上の判定で「UTF-8・BOM なし」と出たら、保存で BOM が付きます。

「�」が出るのはなぜ?直る?

その表では読めなかったバイトが、置き換え記号 U+FFFD(�)になったものです(WHATWG Encoding Standard の error mode "replacement")。ファイルの中にはバイトがそのまま残っているので、正しい表で読み直せば元の字に戻ります。この道具は「�」の数を数えて、少ない表を選びます。すでに「�」の入った文章をどこかからコピーしてきた場合は、そのバイトは失われているので、文字化け復元のページの話になります。

文字コードはどうやって判定している?

順番は3つです。先頭に BOM があればそれで決めます(WHATWG の BOM sniff の表: EF BB BF は UTF-8、FE FF と FF FE は UTF-16)。無ければ UTF-8 として厳密に読み、通れば UTF-8。通らなければ Shift_JIS と EUC-JP の両方で読んで、「�」の数が少なく、ひらがな・カタカナ・漢字の割合が高いほうを選びます。差が小さいときは「決められない」と出して、2つから選べるようにしています。

ファイルはどこかに送られる?

ファイルは端末の中だけで読みます。ブラウザに入っている復号器(TextDecoder)でバイトを読み、保存するファイルもブラウザの中で作ります。社内の名簿や売上の CSV でも、そのまま置けます。

BOM なしで保存できる?

できます。保存の形で「UTF-8(BOM なし)」を選ぶと、先頭の EF BB BF を付けずに書き出します。Unicode の FAQ は、BOM を想定していない受け取り手があり、先頭に決まった文字を求める形式(例: Unix のシェルスクリプトの「#!」)では BOM が邪魔になる、と書いています。プログラムで読むファイルは BOM なし、Excel で開くファイルは BOM あり、が使い分けの目安です。

Shift_JIS で保存できる?

できます。ブラウザの復号器(TextDecoder)から作った逆引き表で書き出します。重なる字の決まりは WHATWG Encoding Standard の Shift_JIS encoder と同じです。Shift_JIS に無い字(絵文字、「𠮷」のような字、波ダッシュ「〜」など)は「?」にして、その数と例を保存ボタンの上に出します。0 なら何も出ません。

改行コードを変えられる?

変えられます。「Windows(CRLF)」は行の終わりを 0D 0A に、「Mac・Linux(LF)」は 0A にそろえます。「そのまま」は元の改行を 1 バイトも変えません。RFC 4180 は改行を含む欄を引用符で囲むと決めているので、引用符の中の改行(セルの中の改行)はどれを選んでも変えません。

CSV を TSV に変換するには?

表の下の「形」で TSV を選ぶと、区切りがタブになります。タブ・引用符・改行を含むますだけ「"」で囲みます(RFC 4180 の決まりをタブに当てはめたもの)。保存の名前は .tsv になり、コピーもできます。逆に TSV を置いて CSV を選べば、カンマ区切りになります。

CSV を JSON に変換できる?

できます。「JSON」は 1 行目を見出しにしたオブジェクトの配列、「JSON(配列)」は行ごとの配列です。値はぜんぶ文字列のままにしています。数に変えると「007」の先頭の 0 が消えるためです。JSON は RFC 8259 §8.1 のとおり UTF-8・BOM なしで書き出すので、文字コードのチップは効きません。

CSV を Excel(xlsx)に変換できる?

できます。「Excel(xlsx)」を選ぶと、端末の中で zip(PKWARE の APPNOTE の構造)と 5 つの XML を組んで .xlsx を作ります。ますの値は文字のまま入れます。Excel の 1 枚のシートは 1,048,576 行・16,384 列までなので(Microsoft の「Excel の仕様と制限」)、それを超える表は作らず、そう表示します。

Markdown の表や HTML の表にできる?

できます。「Markdown」は 1 行目を見出しにした表で、ますの中の「|」は「\|」に、改行は <br> に逃がします。「HTML」は <table> で、& < > " を逃がします。どちらもコピーしてそのまま貼れます。

文字コードだけ変換できる?

できます。「形」をファイルと同じ区切り(CSV のファイルなら CSV)にしたまま文字コードを選ぶと、区切りも引用符も 1 バイトも変えずに、文字コードと改行だけを変えます。UTF-8(BOM あり/なし)と Shift_JIS に変換できます。

「文字化け復元」のページとの違いは?

あちらは化けた文字を貼り付けて戻すページ、こちらはファイルを置いて直すページです。貼り付けた文字は、化けた時点で読めないバイトが「�」に置き換わっていることがあり、その分は戻りません。ファイルにはバイトがそのまま残っているので、こちらは失わずに直せます。