测试 が 娴嬭瘯 になるのは、どのエンコードのせいですか?
UTF-8 → GBK UTF-8 のバイト列を GBK として読んだからです。6 つの UTF-8 バイト(E6 B5 8B E8 AF 95)が、3 つの GBK 文字に区切り直されます。
文字化けしたテキストを貼り付けるだけで元の文字列を復元します。UTF-8、GBK、Big5、Shift_JIS、EUC-KR、Windows-1252 の組み合わせを総当たりで試し、往復検証を通ったチェーンを上位に並べて表示。各エンコードでのバイト対照と hex からの逆変換も可能です。無料・ブラウザ内処理で、貼り付けた内容は送信されません。
文字化けしたテキストを貼り付けてください。考えられるエンコードチェーンをすべて試して結果を並べ替えます——どのエンコードで壊れたのかを知っている必要はありません。
测试
UTF-8 → GBK
娴å¬ç˜¯
Windows-1252 / Latin-1 → UTF-8
测试
Windows-1252 / Latin-1 → GBK
测试
Windows-1251 → GBK
同じテキストが主要なエンコードすべてでどんなバイト列になるかを一度に確認できます——データベースやプロトコルに実際に何が入るのかを正確に知りたいときに便利です。
| エンコード | バイト数 | 16 進数 |
|---|---|---|
| UTF-8 | 6 | E4 B8 AD E6 96 87 |
| GBK | 4 | D6 D0 CE C4 |
| GB18030 | 4 | D6 D0 CE C4 |
| Big5 | 4 | A4 A4 A4 E5 |
| Shift_JIS | 4 | 92 86 95 B6 |
| EUC-KR | 4 | F1 E9 D9 FE |
Go Tools エンジニアリングチームが構築・検証しました。
UTF-8 → GBK UTF-8 のバイト列を GBK として読んだからです。6 つの UTF-8 バイト(E6 B5 8B E8 AF 95)が、3 つの GBK 文字に区切り直されます。
UTF-8 → Windows-1252 同じ UTF-8 のバイト列を Windows-1252 として読んだ場合です。単バイトエンコードなので、6 バイトがそれぞれ 1 文字になります。
復元不可 できません。そのバイトはデコードの時点で捨てられています。周囲のテキストから復元できる分を拾い、残りは元データまで戻って取り直してください。
3 対 2 バイト UTF-8 で 3 バイト、GBK と Big5 では 2 バイト。カラム長を文字数ではなくバイト数で決めたときに、切り詰めが起きる典型的な原因です。
文字化けとは、あるエンコードで書かれたテキストを別のエンコードで読み込んだ結果です。バイト列そのものは無傷で、間違っているのは解釈だけ。この区別こそが、復元が可能である理由のすべてです。どのエンコードがバイトを書き、どのエンコードがそれを誤読したのかを突き止められれば、その間違いを逆向きに実行して原文を取り戻せます。
「文字化け」は日本語がそのまま国際的な用語になったもので、英語圏でも mojibake と呼ばれます。Unicode が普及するはるか前から、日本語の計算機環境ではこの問題が慢性的だったからです。日本語・中国語・韓国語のテキストがラテン文字より圧倒的に被害を受けやすいのには、構造的な理由があります。これらの言語は多バイトエンコードを必要とし、多バイトエンコード同士は「バイトをどう区切るか」で食い違うからです。ラテン文字の文字列はたいてい素の ASCII に収まり、ASCII についてはどのエンコードも一致しています。
復元が失敗するのは 1 つの状況だけです。デコーダが自分のエンコードで意味を持たないバイトに出会うと、それを保持せず U+FFFD に置き換えて捨ててしまいます。その文字は永久に失われます。それ以外はすべて可逆です。
// The mistake, in three lines of JavaScript
const bytes = new TextEncoder().encode('测试'); // UTF-8: E6 B5 8B E8 AF 95
new TextDecoder('gbk').decode(bytes); // '娴嬭瘯' ← mojibake
new TextDecoder('windows-1252').decode(bytes); // '测试' ← same bytes, other mistake 文字化けを貼り付ければ、ツールがチェーンを列挙します。UTF-8、GBK、GB18030、Big5、Shift_JIS、EUC-KR、Windows-1252、Windows-1251 のあいだで「どれで書かれたか × どれで読まれたか」の全組み合わせを試します。
同じチェーンを逆にたどって入力を一字一句再現できたときだけ、候補は完全一致と表示されます。これは決定的な検査です——順位付きの推測だけでは、どの結果を信用してよいのかがわかりません。
各候補には、バイトを書いたエンコードと、それを誤読したエンコードの両方が示されます。来週また新しいデータで同じ文字列を直し直さないために必要なのは、この情報です。
入力にすでに置換文字が含まれていれば、ツールははっきりそう伝え、すべての候補を部分的として扱います。デコード時に破壊された情報は戻ってきません。戻るふりをしても、午後がまるごと無駄になるだけです。
同じテキストを対応エンコードすべてで 16 進バイト列として横並びに表示し、生の hex を逆方向にデコードもできます。カラム長の見積もり、パケットキャプチャの解読、BLOB の中身確認に使えます。
デコードにはブラウザ自身の TextDecoder を使います。アップロードも保存も URL への書き出しもありません——文字化けは本番環境から直接出てくることが多いので、ここは重要です。
娴嬭瘯
测试
この 2 文字はもともと UTF-8 として正しく保存されていました(バイト列は E6 B5 8B E8 AF 95)。その 6 バイトを、あるプログラムが GBK として読み込んだ結果がこれです。GBK は 2 バイトずつを 1 文字に組むため、6 バイトが 3 文字に切り直され、文字数まで合わなくなります。レガシーな Windows アプリケーションで UTF-8 のファイルを開いたとき、あるいはデータは UTF-8 なのにデータベース接続の charset が gbk になっているときに、この形で出ます。
测试
测试
同じバイト列の、別の読み違いです。Windows-1252 は単バイトエンコードなので、6 つの UTF-8 バイトがそれぞれ 1 文字になりました。ラテン文字圏で頻繁に起きるのはこちらで、café が café、naïve が naïve になります。目印は Ã、Â、â と、対になって現れる妙な記号類です。
B2 E2 CA D4
测试
文字化けしたテキストではなく、パケットキャプチャや BLOB カラムから出てきた 16 進ダンプを見ていることもあります。その hex を 2 つ目のセクションに貼り付け、エンコードを選んでください。B2 E2 CA D4 は GBK では 测试 です——同じ 2 文字は UTF-8 なら 6 バイト(E6 B5 8B E8 AF 95)を占め、Windows-1252 ではそもそも表現できません。
鏁版嵁搴�
(部分的にのみ復元可能)
数据库 は UTF-8 で書かれ GBK として読まれましたが、最後のバイト対が GBK では意味を持たず、デコーダはそれを U+FFFD に置き換えました。そのバイトはもう失われています。ツールは体裁のよい推測でごまかさず、この状況をそのまま表示します——先頭側の 数据 は復元できますが、最後の 1 文字は復元不能で、元データまで遡る必要があります。
そのまま貼るだけで、先にエンコードを特定する必要はありません。短い断片で十分——十数文字あればたいていチェーンは絞り込めます。
完全一致は、同じチェーンを逆にたどると入力を一字一句再現できるという意味です。部分的なら再現できないので、結果は手がかり止まりと考えてください。
各候補には、原文が実際に書かれたエンコードと、それを誤読したエンコードが表示されます。文章の中身だけでなく、上流のどこを直すべきかがわかります。
2 つ目のセクションは任意のテキストを主要エンコードすべてのバイト列で表示し、生の hex を逆方向にデコードもします。カラム長の見積もりやプロトコルのフレーム確認に使ってください。
正しく表示されている文字列をそれでも変換すれば、避けようとしていた文字化けを自分の手で作り出すことになります。まず表示を確認してください。フォントが無い場合は豆腐(□□□)になり、エンコードの問題なら別の文字になります。
iconv -f UTF-8 -t GBK correct.txt > broken.txt
# まず現在のエンコードを確認する file -I correct.txt # charset=utf-8 → 変換不要
MySQL のカラムの宣言文字セットを変えても、中に入っているバイトが再エンコードされるわけではありません。latin1 のデータを utf8 と宣言すると、サーバーは正当な UTF-8 ではないバイトを返し、ドライバがそれを U+FFFD に置き換えます——その時点でデータは破壊されます。
ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4;
-- 一度バイナリ型を経由してバイトを保持し、再解釈させない ALTER TABLE t MODIFY c VARBINARY(255); ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4;
部分的と表示された候補は往復検証を通っていません。追いかける価値のある手がかりではありますが、データベースに書き戻してよい答えではありません。完全一致が 1 つも出てこないなら、入力の時点ですでに情報が失われている可能性が高く、元のバイトまで戻る必要があります。
// バッジが何と言おうと先頭の候補を採る db.update(row.id, candidates[0].text);
// 往復検証を通ったものだけ書き戻す if (candidates[0].lossless) db.update(row.id, candidates[0].text);
Python 3 では、すでに bytes のものに encode を、すでに str のものに decode を呼ぶと、ASCII 経由の往復を黙って行う代わりに例外が上がります。境界で一度だけデコードし、それ以降はテキストとして扱ってください。
text = raw.decode('utf-8').encode('gbk').decode('utf-8') # 境界で一度だけ、ファイルが実際に使っているエンコードでデコードする
with open(path, encoding='gbk') as f:
text = f.read() VARCHAR(50) が切り詰めバグに変わるのは、まさにこの手の差です。TextDecoder がそのまま供給します。逆方向は厄介で、TextEncoder は UTF-8 しかサポートしません——そこでツールはバイト空間を走査し、各バイト列が何を意味するのかをデコーダに問い合わせて逆引き表を組み立てます。おかげで対応関係は常にブラウザ自身の挙動と一致し、変換表を端末に配信する必要もありません。Content-Type、ファイルオープンの呼び出し、CSV の書き出し。「システムのエンコード」に任せている箇所はすべて、コードが別のマシンに移った瞬間に同じバグが再発する箇所です。utf8 は 1 文字あたり最大 3 バイトしか格納しないため、絵文字や一部の稀な漢字が黙って切り捨てられます。utf8mb4 が本物の UTF-8 です。これは文字化けとは別種の故障で、本ツールでは救えません——バイトが本当に失われているからです。娴嬭瘯 のような漢字が並びます)と、UTF-8 のテキストが Windows-1252 として読まれた場合(测试 のような文字が並びます)で、どちらも正確に復元できます。 U+FFFD(� と表示されます)に置き換えて捨ててしまいます。この処理は非可逆です。テキストに � が含まれているなら、その文字はどんなツールを使っても戻ってきません。本ページは、それらしく見える推測を出す代わりに、その事実をそのまま伝えます。 iso-8859-1 も latin1 も windows-1252 のラベルとして扱います。両者が異なるのは 0x80–0x9F の範囲だけで、本来の ISO-8859-1 ではそこが制御文字、Windows-1252 では em ダッシュや曲がり引用符といった印字可能な記号になっています。そして文字化けに現れるのはまさにその印字可能な記号なので、実用上は Windows-1252 のほうが役に立ちます。本ツールは 2 つの名前を 1 項目にまとめています。 TextDecoder で行われ、ネットワークに送信することも、ストレージに書き込むことも、URL に載せることもありません。このツールでは特に重要な点です。復元したい文字化けの出どころは、たいてい本番ログ、顧客レコード、データベースのダンプ——サーバー側で処理するツールに貼ってはいけない類のものだからです。 iconv -f GBK -t UTF-8 input.txt > output.txt、PowerShell なら Get-Content -Encoding Default in.txt | Set-Content -Encoding UTF8 out.txt。まず代表的な 1 行を本ページに貼ってエンコードチェーンを確定させてから、コマンドに書くエンコード名を決めてください——方向を取り違えると、1 行の問題が 1,000 行の問題になります。 エンコーディングとフォーマット
ASCII 128文字の完全なコード表。10進・16進・8進・2進を並べ、文字⇔ASCIIコードの双方向変換もその場でできます。制御文字には各言語のエスケープ、キャレット表記、そして実際にどこで出会うかを併記。すべてブラウザ内で動作し、入力は送信されません。
エンコーディングとフォーマット
Base64のデコード・エンコードが無料でオンラインで行えます。リアルタイム変換、UTF-8・絵文字対応。100%ブラウザ上で動作しデータは外部に送信されません。登録不要。
エンコーディングとフォーマット
Base64 文字列やデータURIをブラウザ上で画像に戻します。プレビューし、寸法と MIME を確認して、PNG・JPG・GIF・SVG としてダウンロード。アップロード不要。
エンコーディングとフォーマット
CSVをブラウザ内で即座にJSONに変換。RFC 4180・型推論・ヘッダー行・大整数安全対応。100%プライベート、アップロード不要。
エンコーディングとフォーマット
.env ファイルを貼り付けるだけで即座に JSON に変換。データベースのパスワードや API キー、トークンはブラウザから一切出ません。100% プライベート、アップロード不要、無料の dotenv パーサー。
エンコーディングとフォーマット
HTMLエンティティをデコードし、HTMLをオンラインでアンエスケープ。無料・登録不要・100%ブラウザ内処理。名前付き・10進・16進の参照を文字に戻します。アップロードは一切なし。