PHPでUTF-8以外の文字コードを扱う方法|文字コード変換の留意点も解説!

HTMLファイルやWEB型のアプリでは、文字コードはUTF-8を使うことが標準となりつつあります。
しかし、Shift_JISやEUC-JPなどUTF-8以外の文字コードも、まだまだ使用されています。

Shift_JISやEUC-JPで出力されたファイルをUTF-8を使うアプリで入出力するには、文字コード変換が必要です。
しかし、この変換において文字化けなどの不具合が発生することがあります。

ここでは、PHPでUTF-8とそれ以外の文字コードの変換において留意すべき事項について解説します。PHPで文字データを正しく扱うための参考に、ぜひ読んでみてください。

文字コードの概要と主要な文字コード

文字コード概要

文字コードは、文字をコンピュータが扱える表現とするための規則を定めたものです。

具体的には、文字集合と符号化方式から構成されています。

文字集合は、使用する文字の一覧表です。文字集合においては、各文字に固有の番号が割り当てられます。
世界中にはいろんな言語があり、また、使用する文字も異なります。

日本の漢字に関する文字集合としては、JISX0208やunicodeなどがあります。
例えば、「あ」の文字番号は、JIS0208では「4区1点」の番号、unicodeでは「0面48区66点」の番号です。

各文字集合によって扱える文字の種類や個数が異なる点に留意する必要があります。
例えば、JIS0208には絵文字は登録されていませんが、unicodeでは登録されています。

符号化方式は、各文字の文字集合での番号とコンピュータ内で処理するための数値(バイト表現と呼びます)の変換規則です。

バイト表現は歴史的な経緯からコンピュータやOSによって異なっており、いろんな方式が使われています。
unicodeに対する符号化方式でも、UTF-8のほかに、UTF-16、UTF-32など複数の方式があります。

この符号化方式名を文字コードの名称として使うことが多いです。

おもな文字コード

UTF-8

UTF-8は文字集合unicodeに対する符号化方式です。WEBの世界では標準として採用されつつあります。
ASCIIコード文字は1バイト、それ以外の文字は、2~6バイトで表現します。
漢字、ひらがなやカタカナなどの日本語の文字は基本的に3バイトで表現します。

HTMLを記述する際におまじないとして以下のような記述をしますが、これはHTMLファイル内では、文字コードとしてUTF-8を使用することを宣言しているのです。

ASCIIコード

英数記号や制御文字などの127文字を1バイトで表現する文字コードです。
ASCII文字は、ほとんどすべてのコンピュータで扱うことができます。
また、他の文字コードでもACSII文字は定義されており、ASCIIで使用されていない128番以降の部分に、その他の文字を割り当てています。

Shift_JIS

日本語表記のために用いられる文字コードの一つです。PHPではSJISと表記します。
マイクロソフトやアップルなど主要なベンダーが採用していることから広く普及しています。
Shift_JISは漢字やアルファベット・数字・記号など全ての文字を2バイト(16ビット)で表現します。
文字数とバイト数が一致すること、文字の1バイト目だけで全角文字か半角文字化を判別可能なことが特徴です。
各ベンダーが独自に文字の追加登録を行なっており、windows-31JやCP932といったバリエーションがあるので扱いには留意が必要です。

EUC-JP

UNIX上で日本語を扱う際に利用されてきた文字コードです。ASCII、JIS X 0208(漢字)、JIS X 0201(半角カナ) を扱います。漢字は区点番号に 0xA0 を足します。半角カナは SS2(0x8E) を付加します。
日本語EUCには文字集合としてJIS X 0208:1990を用いるものと、JIS X 0213:2004を用いるものがあります。JIS X 0213:2004はいわゆる半角カナやJIS X 0212のJIS補助漢字を含むことができますが実装されないこともあるので留意が必要です。

PHPでの文字コード変換

文字コード変換に使用する関数ついて説明します。

文字コード変換用関数一覧

おもな関数には以下のものがあります。

関数名 機能概要
mb_convert_encoding 文字コードを変換する
mb_check_encoding 指定したエンコーディングで有効なものかどうかを調べる
mb_detect_encoding 文字エンコーディングを検出する
mb_detect_order 文字エンコーディング検出順序を設定あるいは取得する
mb_list_encodings サポートするすべてのエンコーディングの配列を返す
mb_internal_encoding 内部文字エンコーディングを設定あるいは取得する

mb_convert_encodingの使い方

文字コードを変換する関数mb_convert_encodingの使い方は以下のとおりです。

<関数形式>

mb_convert_encoding ( $string , $to_encoding , $from_encoding = null )

<引数>

引数 説明
$string array
string
・変換したい文字列を指定します。
・配列を指定した場合は、すべての要素が変換されます。
$to_encoding  string ・変換後の文字コードを指定します。
$from_encoding array
string
null
・変換前の文字コードを指定します。
・複数の文字コードを指定でき、その場合は先頭からチェックします。
・省略可能で、省略した場合は内部エンコーディングの文字コードが設定されます。

<戻り値>

・変換成功時は変換後の文字列がstringまたはarray形式で戻されます。
・変換失敗時はfalseが戻されます。

mb_convert_encodingの使用例

【Shift-JISからUTF-8へ変換する】

【変換元の文字コードを指定した候補から自動で判別してUTF-8へ変換する】

mb_convert_encoding使用についての留意事項

・第2引数および第3引数で使用できる文字コードの詳細は、PHPマニュアル:サポートされる文字エンコーディング を参照してください。

文字コード名に”auto”を指定すると、”ASCII,JIS,UTF-8,EUC-JP,SJIS”を指定したものとみなされます。

PHPで文字コードを扱う際の留意事項

Shift_JISにはバリエーションがある

Shift_JISはNECやIBM、マイクロソフトなどのベンダーが独自に文字(機種依存文字)を追加した文字コードが発表されていますが、現在ではマイクロソフトがWindows用に制定したWindows-31Jに集約されています。

よく使う文字としては、下記のようなものがあります。

・丸数字 (①②③…⑳)
・ローマ数字 (ⅠⅡⅢ…Ⅹ、ⅰⅱⅲ…ⅹ)
・カッコ付きの株 (㈱)
・はしご高[はしごたか] (髙)
・たつ崎[たつさき、たちさき] (﨑)

PHPでは、文字エンコーディングとして SJIS-winを指定することで、Windows-31J を使用できます。
mb_convert_encoding()でSJISとUTF-8の変換で文字化けを起こすようであれば、SJIS-win を使ってみましょう。

また、EUC-JPについても、Windows特有の文字(IBM拡張文字)である環境依存文字を使いたい場合は、”CP51932”を使うとよいでしょう。

UTF-8での日本語の文字数取得について

UTF-8は文字によってバイト長が1~6バイトの範囲で変化します。したがって、文字数をカウントするには文字列の長さ(バイト数)を調べるのとは異なる方法が必要です。

日本語文字列の文字数をカウントするには、mb_strlenを使用します。

<関数形式>

mb_convert_encoding ( $string , $encoding = null )

<引数>

引数 説明
$string string 長さを調べたい文字列
$encoding string
null
文字エンコーディングを指定します。
省略または null の場合は、 内部文字エンコーディングを使用します。

<戻り値>

・文字数が戻されます。

まとめ

いかがでしたか?今回は、PHPでの文字コードの扱いをUT-8を中心に説明しました。

WEBではUTF-8を使用することが一般的になってきましたが、それ以外の文字コードを使ったリソースが多数あり、文字コード変換において文字化けしないように対処すること必要です。特に扱える文字セットの違いに留意することが大切ですね。

この記事が、WebプログラミングやPHPの学習などでのお役に立てば幸いです。