Hatena::ブログ(Diary)

Affirmative Way

2007 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 09 | 11 |
2010 | 01 |
2011 | 01 | 06 |

2008-06-19

PHPで名前を扱う場合、文字コード指定に注意が必要

CakePHP のおいしい食べ方: EUC-JPではなく、EUCJP-win!!!

お客さんがWindowsを使うと分かっていて、日本語の名前に関するデータ処理をするようなプログラムを書く場合、

$str = mb_convert_encoding($str, "EUC-JP", "UTF-8");

なんてやっちゃだめです。

$str = mb_convert_encoding($str, "EUCJP-win", "UTF-8");

としないと、あとできっと、顧客からクレームが来ます。

知らずに中で使っていて、まさにご指摘いただきました。


具体的にどういうことが起きるかというと。

f:id:cos31:20080619151026g:image とかf:id:cos31:20080619151027g:image のような文字の文字コードを変換する場合

"-win"って指定してないとその文字が消えるんです


これ、実はメールの本文の文字コード(ISO-2022-JP)でも同様のことが起きます。

Old Nabble - Php Japan - PHP-dev - [PHP-dev 1345] PHP への CP932 系エンコーディングの追加パッチ

このパッチを適用する事により、次の事が実現されます。

1) Windows機種依存文字シフトJIS (SJIS-win)、日本語EUC (CP51932、

eucJP-win)、7ビットJIS (ISO-2022-JP-MS) で扱えるようになります。

2) Windows 上で作成された UnicodeシフトJIS (SJIS-win)、日本語EUC

(CP51932、eucJP-win)、7ビットJIS (ISO-2022-JP-MS) との間で変換可能

になります。

PHP5.2.1以降ならば、すでにパッチが当たってるので、以下のような書き方でOKです。

<?php
// mbstring.internal_encoding euc-JP-win

// これだと文字が消えます
$result = mb_convert_encoding( $str, "ISO-2022-JP", "euc-JP-win");

// これだとちゃんと表示されます。
$result = mb_convert_encoding( $str, "ISO-2022-JP-MS", "euc-JP-win");


いやーびっくりした。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/cos31/20080619/php_encoding