2018年12月19日水曜日

全角ハイフン文字に悩む

windowsにおいて、sjisファイルのデータを、mysqlに保存しました。
全角ハイフン(ー)が、ファイルの場所により、異なる文字に変換され、悩みました。

例えば、「WinーJpー2」という文字があると、「WinーJp-2」のように、最初の文字は、全角ハイフンっぽく見える文字(文字コードは異なる)に、次の文字は、マイナス(-)になりました。
これは、根本的な解決策をとらずに、小手先の対応をした結果です。

<経緯>
Windowsサーバーに、PHP+MySQLのシステムがあります。ここでは、文字コードは、utf8に統一しています。
このシステムに、従来は、Visual Basicで、sjisファイルを、utf8文字コードに変換して、データベースに保存していました。
このVisual Basicで処理していた変換処理を、PHPで行ったところ、全角ハイフンが含まれていると、別の文字(-に似た文字)として保存されました。
具体的には、従来は、E28892として保存されていたのに、EFBC8Dとして保存されました。
これは、IBM-Unicodeと、Ms-Unicodeの違いによるらしいです。

それなら、EFBC8Dを、E28892に置換してやれば、とりあえず、解決できるだろうと、横着しました。
その結果、先に述べたように、複数ある、全角ハイフンのうち、置換される文字と、置換されない文字が出てしまい、ますます、混乱しました。

調べてみると、そもそも、sjisの全角ハイフンの扱いに関して、マイクロソフトと、sjisで違いがあることが原因だそうです。
そういえば、sjisも、複数あったなと思い出しました。

<解決策>
$data = mb_convert_encoding($str, 'UTF-8', 'SJIS');
は、だめです。

$data = mb_convert_encoding($str, 'UTF-8', 'sjis-win');
で、期待通り、動きました。

0 件のコメント:

コメントを投稿