読者です 読者をやめる 読者になる 読者になる

iconvで文字エンコーディングを変換する

PHP

 PHPの文字エンコーディングに関する処理は、mbstring関数を使うのが一般的でしょうが、環境によってはmbstring関数が使えず、iconv関数しか選択肢がないこともあります。
 iconvはmb_convert_encodingとパラメータの取り方が違い、しかも変換結果も異なることがあるので、その内容をメモしておきます。

string iconv ( string in_charset, string out_charset, string str )

 iconvは、変換後の文字集合名out_charsetの後ろに、オプション文字列//TRANSLIT, //IGNOREを付けることで、変換できない文字に遭遇した場合の振る舞いを返ることができます。
//TRANSLITは似た文字列での置換、//IGNOREは切り捨て・処理の続行を意味します。
このオプション文字列は、"UTF-8//TRANSLIT", "EUC-JP//IGNORE"のように、文字集合名の後に、空白をいれないで追加します。空白を入れた場合はWarningが発生します。


 次のようなコードで出力を試してみました。
【追記】(株)という機種異存文字を使用しているので、ブラウザ・OSによっては正しく表示されないかもしれません。

<?php
error_reporting(E_ALL);

$value = 'チーズのことなら㈱チーズショップ';
foreach(array('EUC-JP', 'EUC-JP//TRANSLIT', 'EUC-JP//IGNORE') as $out) {
   $euc = iconv('UTF-8', $out, $value);
   print "$out : {$euc}\n";
}
?>

 実行すると、次のように出力されます。

$ php5 test.php

Notice: iconv(): Detected an illegal character in input string in /tmp/test.php on line 7
EUC-JP : チーズのことなら
EUC-JP//TRANSLIT : チーズのことなら(株)チーズショップ
EUC-JP//IGNORE : チーズのことならチーズショップ

 デフォルトの動作では、対応する文字が見つからないと、Noticeが発生し、そこで変換が打ち切られてしまいます。
 //TRANSLITを使った場合は、㈱が(株)に置き換えられ、//IGNOREを使った場合は、切り捨てられています。


 なお、上記の例は機種異存文字を含むため、mbstring関数を使って確実に変換するためには、変換後の文字コードに"eucJP-win"を指定する等の配慮が必要です。

# "チーズのことなら?チーズショップ"と出力
print mb_convert_encoding($value, 'EUC-JP', 'UTF-8');
# "チーズのことなら㈱チーズショップ"と出力
print mb_convert_encoding($value, 'eucJP-win', 'UTF-8');

超・極める! PHP

超・極める! PHP


 『超・極める! PHP』の日本語処理に関する章は、非常に参考になるのですが、iconvの//TRANSLITと//IGNOREに関する記述はなかったように思います。(立ち読みしかしていないので、うろ覚え。)