[PHP-users 2818] Re: [Q]関数[Strtr()] での文字化け
Akihiro Sagawa
php-users@php.gr.jp
Wed, 17 Oct 2001 20:41:52 +0900
こんにちは。佐川です。
指摘があれば...とのことなので、遠慮なく。^^;
以下の引用部分は'水迫清仁'さんの
"[PHP-users 2811] Re: [Q]関数[Strtr()] での文字化け"からのものです。
>> また、関数[Strtr()]にて全角文字を半角文字へ変換していたものは、
(snip)
>
> $co_trans = array("A","A", "B","B",・・・);
>
> $num = 0;
> $num = count($co_trans);
> for($i=0; $i<$num - 1; $i = $i + 2){
> $trans_words = str_replace($co_trans[$i], $co_trans[$i + 1],$search_word);
ここの$co_transには2バイト文字が入るわけですが、
PHPの場合文字はバイト単位で扱われるので、
str_replaceで単純に変換することはできません。
> $search_word = $trans_words;
> }
たとえば、スクリプトがEUC-jpでかかれていた場合、
「坑道」が「F」->「F」の変換で化けたりします。
# 「坑」の後1バイトと「道」の頭1バイトが、「F」の表現と同じだから。
# # Shift_JISだったら、「スモモ`モ'モモ`モ'モモノウチ」が化けるでしょう。
一番楽な解決方法は、
PHP4.0.6にバージョンを上げてmbstringを組み込むことです。
mb_convert_kana関数でこのような全角半角変換が簡単に実現できます。
http://jp2.php.net/manual/ja/html/function.mb-convert-kana.html
# PHP4.0.5ならばjstringモジュールで同等の機能を得られます。
余談で、今回の問題の解決にはつながりませんが、4.0.5以降の
str_replaceは、配列で変換元と変換先を指定できるので、
バイト列を一括で変換したい場合に使うと効率がいいと思います。
http://jp2.php.net/manual/ja/html/function.str-replace.html
では。
☆・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・
佐川 昭宏 mailto:sagawa@sohgoh.net
http://pelican.sohgoh.net/
・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・☆