Eyecatch php

PHP

PHPで機種依存文字を変換する場合は文字コードをSJIS-winにしてから!

2013/05/25

PHPでCSVファイル取込機能を作成中、機種依存文字である「㈱」を「(株)」に変換しようとした時にはまってしまったので、その対策方法を忘備録としてポストしてみます。

上手くいかないこと

作成しているシステムでCSVフォーマット(文字コードはSJIS)のファイルからインポートする機能をつけました。
その時にありがちですが、社名や備考などに含まれている機種依存文字の「㈱」を「(株)」に変換しようとしたら、全然うまく行かない。
シンプルに str_replace() で当てても変換されない始末。

CSVファイル取込・変換の基本的な流れは以下の感じ。

  1. CSVファイルをオープン
  2. 全体の文字コードをSJISからUTF-8に変換
  3. 機種依存文字を変換

かなり単純に書きましたが、特に変なことはしていないと思います。
悶々と作業していたのですが、急に思い出したことがありました。
そうなんです、やつらの文字コードは単純な SJIS ではなく「SJIS-win」という文字コードなんですね。

SJIS-winとは

SJIS-winとはなんぞやというのは、コチラで分かりやすく書いてくれています。

floatingdays: PHPの SJISと SJIS-WINの違い
http://fdays.blogspot.jp/2011/03/php-sjis-sjis-win.html

重要なのはこの辺り。

SJISとSJIS-WINで何が違うの?
SJIS-WINの方が文字が多い。
よく使うところでは、下記のような文字はSJISーWINにはあるがSJISにはない。
•丸数字 (①②③...⑳)
•ローマ数字 (ⅠⅡⅢ...Ⅹ、ⅰⅱⅲ...ⅹ)
•カッコ付きの株 (㈱)
•はしご高[はしごたか] (髙)
•たつ崎[たつさき、たちさき] (﨑)

単純な SJIS には含んでいないってことなんですね。

解決方法

じゃあどうすりゃいいんだ、って事で、良いのか悪いのは分かりませんが、以下の様な関数を作ってみました。

replaceStrKishuizon()

変換する文字種にはもっと色々と入れるべきなんだと思いますが、今回は(サンプルってことで)とりあえず23種類。
CSVをオープンしてUTF-8に変換後、氏名やら住所やら、を登録用配列に入れる際に、会社名($companyとします)に対して先ほどの関数を施します。
やってることは、UTF-8に変換されている $company を SJIS-win にコンバート。
コンバート後の $company に含まれる「㈱」を「(株)」に変換し、再度 UTF-8 に変換してリターン。

かなり泥臭いですが、なんとか無事に変換はできました。
もっとスマートな方法はいくらでもあると思うのですが、とりあえず思いついたのがこの方法なので、何かの際には試してみてやってください。

-PHP
-, , ,