テキストデータの文字コードを、SJIS(Shift JIS)からUTF-8に変換するとき、文字化けが起こった。
●波ダッシュ問題
代表的な文字化けの例として、いわゆる「波ダッシュ」問題がある。
波ダッシュ - Wikipedia
Unicodeに関連する問題
Unicodeの仕様書では、U+301C WAVE DASH(波ダッシュ)に、「JIS punctuation」という注釈を施しておきながら、JIS X 0208の波ダッシュの例示字形(“上がって下がる” 形)とは異なる形(“下がって上がる”形)を印刷してしまった。
この影響を受けて、Microsoft Windows(XP以前)ではUnicodeの波ダッシュ(U+301C, WAVE DASH)は“下がって上がる”形で表示される。
このWindows独自のUnicodeが産んだ非互換性により、環境によっては文字化けを起こす機種依存文字となってしまっている。
アプリケーションでは、Microsoft漢字コード (CP932)というShift_JISのスーパーセットを用いて対応しているケースが多い。
●「SJIS-WIN」(CP932)を利用
検索したら、解決方法が紹介されていた。
SJISのコード表をUTF8に変換する - jitteの日記
print mb_convert_encoding($line, 'utf8', 'sjis-win');
第3引数のsjis-winは、波ダッシュをちゃんと変換してくれるらしい。
ざっと見たところ、波ダッシュ、丸数字、ローマ数字とかも含め、完璧っぽい。
文字コードの指定方法として「sjis」ではなくて、「sjis-win」を使えばOKとのこと。
PHPで日本語の文字コードを変換するとき、「mb_convert_encoding」関数を使う。
PHP: mb_convert_encoding
string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] )
文字列 str の文字エンコーディングを、 オプションで指定した from_encoding から to_encoding に変換します。
PHPで文字コードをSJISからUTF-8に変換するとき、
mb_convert_encoding($string, 'utf8', 'sjis');
だと上記の文字化けが発生するが、
mb_convert_encoding($string, 'utf8', 'sjis-win');
だと上記の文字化けが発生しなくなった。
![]() | 文字コード超研究 (2003/07) 深沢 千尋 商品詳細を見る |
他にも「Windowsの機種依存文字」の対処方法を紹介しているブログがあった。
304 - narucissus is Not Modified: はしご高()や立ち崎()をJIS基本漢字(JIS X 0208)に変換するマップ作成の手順
=携帯サイトを作るときに、携帯電話では表示できない文字を置換するのに役立つようだ。
「sjis-win」で思い通りの処理ができない事例があるとすれば、このような方法で無理矢理変換すればOK?
●「eucjp-win」
EUC-JPからUTF-8に変換する場合でも、同様の文字化け問題があるらしい。
SJISじゃなくてSJIS-win、EUC-JPじゃなくてeucJP-winを使おう
文字コード変換の指定で、Shift_JISを使う時は、SJISじゃなくてSJIS-winを使おう。
EUC-JPを使う時は、EUC-JPじゃなくてeucJP-winを使おう。
winをつけるとWindows拡張の文字も、うまく変換してくれます。
●「sjis-win」とは?
文字コードの名称として「CP932」というのがあるが、これは別名「sjis-win」とも呼ばれている。
Microsoftコードページ932 - Wikipedia
Microsoftコードページ932(以下CP932)は、マイクロソフト及び、MS-DOSのOEMベンダがShift JISを独自に拡張した文字コードである。
また同時に、CP932はShift_JISのWindowsアプリケーションにおける「実装」を指す用語であるとも言える。
CP932の呼称(別名)の整理
Windows-31J
MS932
CP932
MS漢字コード
OEMコードページ932
以下は、マイクロソフトから離れ、現在では公的機関からも認められた文字符号化方式を指す用語である
シフトJIS
Shift_JIS
SJIS
CP932には、いろいろな呼び方・別名が付けられているので、混乱しないように注意したい。
- 関連記事
-
- DooPHPのコールグラフ
- PHPをC++に変換するHipHop for PHP
- PHPのプロファイラー「XHProf」の使い方
- 継承できるテンプレート「Twig」
- CodeIgniterのMatchBoxとHMVC
- 祝!1万部超え『PHP逆引きレシピ』プレゼントキャンペーン
- CodeIgniterをHMVCでモジュール化
- PHPで文字コードをSJISからUTF8に変換する方法
- PHPで配列の重複を削除する方法
- Fatal error: Allowed memory size of 16777216 bytes exhausted
- PHPのstrlen関数で全角文字が3バイトになる件
- PHPでファイル一括削除
- PHPで日時の大小比較
- CodeIgniter 1.7.1 日本語化パック
- AmazonのASINで、36進数を10進数へ変換