文字化けや^Mが出る問題の解消ポイント!

LINEで送る
LinkedIn にシェア
Pocket

突然壊れた文字が出て来て驚いたことないでしょうか。プログラムを書いたり、ホームページを作っている時に出会うことがあります。メールの送受信でもありますね。

文字化けのページ

上の図は文字コードを意図的に変えて文字化けを起こしてます。文字化けが起こるのは作った側が知らなかったために起きることがほとんどで、気を付けると回避できるようになります。

せっかく作ったコンテンツです。文字化けなんかに邪魔されたくありません。このページではフリーソフトを使って文字化けにクールに対応できるようにしたいと思います。

文字化けを回避する方法

文字化けしたり、^Mが行末に出てくる原因は次の2点です。

  1. 文字コードを合わせる
  2. 改行コードをOSに合わせる

文字化けや改行で異常が発生する原因

Windowsは日本語を表現するためにShift-JISという文字コードを使っています。最近はUTF-8が主流になりつつあります。文字化けは、ネットワークを構成しているWindowsやサーバのLinux、アプリケーションが使う文字コードが違う場合に発生します。例えばWindowsではSJISを標準では使います。他の文字コードはあまり使われません。

LinuxではEUCが従来まで標準でした。今はUTF-8が主流になりつつあります。生まれも育ちも違うOSのため、文字コードが合っていないのも仕方が無いと思います。実はOSとその上で動作するアプリケーションでも文字コードが異なる場合があります。

文字コードを合わせる

WindowsではShjift-JISを主に使い、UnixはEUCを日本語文字コードに使っているので、そもそも文字化けする環境が出来上がっています。これは日本語の表し方の違いなので方言と言っても良いでしょう。方言をなくして共通の標準語とするため、文字コードにおいてはUTF-8を使う流れです。

 
OS 従来の日本語コード 今後の日本語コード
Windows Shift-JIS UTF-8
Unix EUC UTF-8

まだShift-JISやEUCを使う場合もありますので、文字コードがOS毎に違うことを意識しておくと文字化けに落ち着いて対応できます

文字コードって何のためにあるのか?

もともと、WindowsやUnixが登場した時に、文字コードを統一するという流れではなかったためです。

もともとネットワークで繋ぐという想定がありませんでしたWindowsパソコンはもともとパーソナルコンピュータであり、単独で動いていましたので、文字コードが違う機器と通信することは考えていませんでした。Unixはもともとネットワークで接続して使うことを想定しており、Windowsとは役割が違っていたため文字コードを合わせるという方向に向かなかったのです。

 
OS 改行コード
Windows CR+LF
Unix LF

WindowsとUnixで改行コードが違うため、Windowsで作ったファイルをUnixに持っていくと行末に^Mという文字が現れることがあります。これがCRを文字で表したものになります。

文字コードを合わせるために気を付けること

すべてのファイルで文字コードを最初に合わせましょう。Windowsのアプリ開発であるなら、文字コードはShift-JISを最初から使います。

逆にプログラム開発でUnixが主体であるなら、文字コードをEUCで初めから統一しておくと良いでしょう。

最近では文字コードをUTF-8で統一する流れです。過去のプログラムを修正する場合には文字コードに注意する必要があります。

文字化けを回避するポイント

設計段階から使う文字コードを統一する。Windowsが主ならShift-JIS、Unixが主ならEUCを使います。

それでも文字化けが発生したら

後で紹介するテキストエディタを使って文字コードを一括で修正しましょう。

改行コードを合わせる

WindowsとUnixでは文字コードが違っていますが、さらに改行コードも違っています。

改行コードって何のためにあるの?

改行コードは文字通り、行末で次の行の先頭に移すためのコードになります。Windowsはもともと接続することをあまり想定していなかったため、改行コードも併せるという流れにならなかったのです。

改行コードを合わせるために気を付けること

文字コードと同じですが、すべてのファイルで改行コードを最初に合わせましょう。Windowsのアプリ開発であるなら、改行コードはCR+LFを最初から使います。

逆にプログラム開発でUnixが主体であるなら、改行コードをLFで初めから統一しておくと良いでしょう。

行末で^Mが出たり改行されないトラブルを回避するポイント

設計段階から使う下位行コードを統一する。Windowsが主ならCR+LF、Unixが主ならLFを使います。

それでも改行で^Mや改行されないトラブルが発生したら

後で紹介するテキストエディタを使って改行コードを一括で修正しましょう。

メールの文字化け解決法

プログラムでメールを作って、送りました。でもメールソフトで見ると文字化けしていて見えない…ということがあると思います。正直言って頭抱えたくなりますよね。

解消ポイントはメールヘッダとメール本文で違うので分けて説明します。

文字化け対策に頭を抱えている状態

件名・To:・Ccなどメールヘッダに日本語を入れたい

既に知っているかもしれませんが、メールの形式は7ビットで構成するASCII文字しか送れません。それでは英語圏以外の人には不便なので、拡張されました。日本語でメールを送るには、7ビットでMIME拡張した機能がRFC1468として規定され、主に文字コードはJISを使っていました。

もう一つ、8ビットでMIME拡張するRFCも公開(RFC6152)されています。8ビットを使う場合は、文字コードはUTF-8が主流です。7ビットの場合と8ビットの場合で、日本語の扱い方法が若干違います。

 
ヘッダ (1)JISの時の値 (2)UTF-8の時の値
Content-Type text/plain; charset=iso-2022-jp text/plain; charset=UTF-8
Content-Transfer-Encoding 7bit 8bit
From, To, Cc, Subject

JIS文字列をBASE64変換して、=?ISO-2022-JP?B? と?=で挟み込む

UTF-8文字列をBASE64変換して、~?UTF-8?B?と?Bで挟み込む
MIME-Version 1.0 1.0
ポイント 7bitは標準のため、エラーにならない。古くから使われているデファクトスタンダード 8ビットMIMEの主流

From,To,Cc,Subjectに入れる?B?はBase64の時ですが、?Q?はQuoted-Printableの形式と言われています。2つの違いはRFC2047がわかりやすいと思います。

メール本文の文字化け解消法

メール本文はメールヘッダと同じ文字コードで記載してあれば文字化けしません。JIS(ISO-2022-JP)を使う場合は文字コードをJISで、UTF-8を使う場合は文字コードをUTF-8として本文を記載します。

メールソフトによってはUTF-8を解釈できない場合がありますので、「メールが文字化けする」と言われてトラブルになります。メール送信の文字コードにはJISを使うことをお勧めします。

文字化け解消にテキストエディタがお勧め

文字化け解消には文字コードや改行コードを一括返還できるテキストエディタをお勧めします。具体的にお勧めできるエディタはサクラエディタです。サクラエディタのホームページ(外部サイト)からダウンロードできます。

サクラエディタのインストーラパッケージをダウンロードしてインストールしてください。サクラエディタの機能の詳細は省略しますが、文字コードや改行コードを保存する時に変換できます。下の図を見てください。上書きではなく、「名前を付けて保存」する時に出るダイアログです。

サクラエディタで文字コードと改行コードを指定する場所

上の図で①が文字コードを指定、②が改行コードを指定します。①の部分をクリックすると下の図のように変更できる文字コードの種類が出ます。

変換できる文字コード

上の図のように文字コードの種類が表示しますが、主に使うのはUTF-8、SJIS、JIS、EUC-JPくらいでしょうか。変換したい文字コードを指定して保存するとデータの文字コードを変換できます。

次に②の改行コードをクリックすると、下の図のように変更できる改行コードが表示されます。

改行コードの変更選択

選べる改行コードはWindows標準のCR+LF、UNIXやLinuxのOSで標準であるLF、Macは(よく知らないのですが)標準であるCRに変換ができます。

プログラムの文字コードと出力する文字コードが違う場合

プログラム内ではUTF-8やSJIS、EUCなど何れか一つに統一した文字コードで記載し、出力する直前で指定したい文字コードに変換して出力しましょう。PerlのJcode.pmや、PHPならmb_convert_encodingなどです。

Windowsであれば文字コードはUTF-8かSJISで編集して、出力する関数で文字コードを変換して出力すると処理がしやすいです。Linuxで動作させるプログラムを作るならば、改行コードはLFに統一した方が安全です。

LINEで送る
LinkedIn にシェア
Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です