CSV の文字化けを直す・変換する
CSV・TSV ファイルをここに置くか、えらぶ50 MB まで。ファイルは端末の中だけで読みます
Shift_JISBOM なしカンマ
mihon.csv159 バイト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 ファイルを置くと、文字コードを判定して表で見せ、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 に変換できます。
「文字化け復元」のページとの違いは?
あちらは化けた文字を貼り付けて戻すページ、こちらはファイルを置いて直すページです。貼り付けた文字は、化けた時点で読めないバイトが「�」に置き換わっていることがあり、その分は戻りません。ファイルにはバイトがそのまま残っているので、こちらは失わずに直せます。