ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    最新の広告

    VPSでWebサイトを作る


    ドメイン名を取得する


    プログラミングの質問サービス


    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    FC2ブログ 管理画面


    with Ajax Amazon

    PHPで文字コードをSJISからUTF8に変換する方法

    このエントリーをはてなブックマークに追加
    Webサイトを作っていると、文字コードの取り扱いで困ることがある。
    テキストデータの文字コードを、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には、いろいろな呼び方・別名が付けられているので、混乱しないように注意したい。
    関連記事
    このエントリーをはてなブックマークに追加

    コメント

    管理人のみ閲覧できます

    このコメントは管理人のみ閲覧できます

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    https://hamamuratakuo.blog.fc2.com/tb.php/446-2c9b1c31