ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:文字が化けて保存できない現象への対処

以前作られたプログラムをベースに、部分的に修正を加えて利用したら、データベースへの登録時にエンコーディングできないエラーが発生しました。

そのときに表示されたエラーメッセージです。

Query failed: ERROR: invalid byte sequence for encoding "EUC_JP": 0xcb2e HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

f:id:AJYA:20130925125537j:plain

photo credit: sisssou via photopin cc

調査

エンコーディングの問題だということはわかったので、入力した内容を確認しましたが、特殊な文字は使っていませんでした。

 

EUC-JPではだめなのかと思いながら試していると、同じ内容を入力しても、入力画面から確認画面に遷移した際に、ほぼ無加工で表示していれば文字化けしませんが、文字列の置換をして表示していると文字化けが発生していることに気がつきました。

 

原因

化ける場合と化けない場合を比べながら、なにが原因か調べたら、str_replace()関数で「。」を置換していたためでした。

 

ECU-JPでは、「。」の文字コードは、0xA1A3になります。

文字化けしている部分の文字の文字コードを見ると、「法」の文字コードが0xCBA1で、 「X」の文字コードが0xA3D8でした。

str_replace()関数が、マルチバイトを考慮されていないので、「法X」と文字が並ぶと置き換えられて、文字化けしていました。

 

対策

str_replace()関数から、mb_ereg_replace()関数に置き換えたところ、文字化けしなくなり、データベースにも登録できるようになりました。

引数の変更をしなくても適用できたのはありがたかったです。

 

 

なぜマルチバイトにstr_replace()関数を使ったのかは、今となっては謎です。