[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/
  ・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・☆