skillup

技術ブログ

PHP

mb_convert_encodingに関して(文字コードの自動検出やその周辺)

投稿日:2018年11月18日 更新日:

以前Perlでもやりましたが、文字コードの自動検出に関して。

ちなみにcp932=SJIS-WINです。

参考リンク

Perlでの動的改行コード読み込みに関して+cp932ネタ

PHPの場合、mb_detect_encodingという文字コード検出の関数があるらしいのですが、どうやらあまり当てはまらないらしく、頼れないようです(汗)

PHPの文字エンコーディング検出はアテにならない

今回はテキストファイル(文字コード不明、ただし実際はsjisかutf8)を読み込みutf8に変換するって処理が必要だったんですが、元のエンコーディングがわからないとどうしようもないです。

で、色々調べたところmb_language('Ja')+mb_convert_encoding($file_contents, 'UTF-8','ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN,SJIS');
でいけるようです。mb_convert_encoding($file_contents, 'UTF-8','auto')という手法もありますが、autoよりも実際の文字コードを列挙するほうが精度が高いようです。

*特にSJIS-WINはSJISより前においたほうがいいようです。SJIS-WINにあってSJISにないものを検知できるので。

mb_convert_encodingで第3引数には元々のエンコーディングを書きますが、これがautoになっていると複数の文字コードからPHPが検出テストを行い、この文字コードであろうという推測を行います。

列挙する場合、先頭の文字コードから順にチェックをしていくようです。だからSJIS-WNをSJISの前にしたほうが都合がいいかもしれません。

(おそらく100%ではないと思います。vimも自動検出機能がありますが、たまに間違えますが、同じことだと思います。だから文字コードがわかっていれば第3引数は文字コードをセットするのが当然無難です。)

が、通常だとSJIS-WINが候補にないのかUnable to detect character encodingというエラーがでてしまいます。

そこでmb_language('Ja')をセットすることでSJIS-WINが検出できるようになります。

mb_convert_encodingのautoが危険な理由

またmb_substrのような関数がありますが、おそらくPHP内部でマルチバイトに対して特殊なフラグを設定しているものと思われます。

ここら辺Perlはしっかりと分けて判定しないくてはいけないので面倒な分、理解せざるを得ませんでした。

参考リンク

Perlの文字コードに関して その1

Perlの文字コードに関して その2

Perlの文字コードについて その3

 

-PHP
-

執筆者:


comment

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

関連記事

no image

xdebugに関して

PHPでお手軽にできるdebugツールとしてxdebugを。 Contents1 利点2 インストール3 参考リンク 利点 var_dumpの結果が非常に見やすい(単純ですがこれが一番大きい理由です。 …

no image

PHPメモリ測定

プログラムのメモリ測定に関して。今回はWordPressの処理に関してです。 まずはソースから。 処理を入れているファイルはルートディレクトリ直下のindex.phpです。 [crayon-5f083 …

no image

cakePHPのajax

cakePHPのajaxですが、javascriptはいいとして、コントローラー側をどう実装するのか気になる方は多いでしょう。 cakeの画面は基本的にコントローラーにアクセスした後は通常はビューに遷 …

no image

PHPにおけるstaticキャッシュ

PHPにおけるstaticキャッシュに関して。 PHPのおけるキャッシュはいくつかありまして、一般的にはmemcachedなどのKVS方式のキャッシュサーバーなどを使う方法が一般的かと思います。 キャ …

no image

cakeでのトランザクション、コミット、ロールバック

cakePHP(2.X系)でのトランザクション、コミット、ロールバックについて。 cakePHPでトランザクションを書ける場合、Model内に [crayon-5f083971f1aae6891878 …