68user's page 掲示板

Prev< No. 2181> Next  [最新発言に戻る] [過去ログ一覧]
No. 2181 # 2001/10/06 (土) 12:31:57
/tkさんが教えてくれた↓のページを読むと,
> http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-1

・convert()は内部ではgetcode()を自動的に呼び出し文字コードを判断する
・getcode()では,半角カナは文字コードの自動認識の判断対象からはずされる

とあります。また,スナフキンさんが
> そこそこの長文を表示すると、うそのように表示される場合が有りました。

と言われたように,私の場合も半角カナ以外の文字をある程度以上追加すると
文字化けしないことがあります。
例)アイウエオ(半角)         →竺軸宍雫七(全角)
        アイウエオ(半角)あいうえお(全角)→アイウエオ(半角)あいうえお(全角)

これらのことから,今回の文字化け現象の原因は,convert()が
(正確にはgetcode()が)半角カナの文字コードを
正確に判別できていないことのようです。

これを調べるためにコンバートの前後でgetcode()をかけてみました。

$code1 = &jcode::getcode(\$str);
jcode::convert(\$str, 'euc');
$code2 = &jcode::getcode(\$str);

その結果,次のようになりました。

$str = 'あいうえお'     → $code1 = 'euc',$code2 = 'euc'
$str = 'アイウエオ(半角)' → $code1 = 'sjis',$code2 = 'euc'

つまり,getcode()は半角カナの「アイウエオ」をsjisと判定して
sjisをeucに変換する処理をしていたのです。

長々と書きましたが,68userさんが書かれたように,
> Shift_JIS の半角カナと EUC-JP を正確に
> 判別することはできないので、EUC-JP な半角カナを Shift_JIS の
> 文字列だと誤認してしまい、EUC-JP に変換しようとする、ということは
> あります。

ということのようです。

で,ここでどうするかというプログラム上のアイデアが問われるのですが,
(残念ながら例の本には載っていません・笑)
今は,「$strに全角文字を数個追加して,コンバート後にそれを除く」ということを
考えています。
ただ,自分でもかっこ悪いなぁと思うので,他にアイデアがあれば教えて下さい。


>>2176 68user
> いいえ、@a[0] はスライスを使っているわけではありません (よね?)。

私は/tkさんが教えてくれたページを読んでスライスを覚えたので
No.2179の/tkさんと同じ解釈をしたのですが,
この解釈の違いによって,使い方とその結果が変わるということが
ないのであれば,あまり本質的な問題ではないような気がします。
68userさんが正しい知識を教えようとしてくれる気持ちはとてもありがたいです。

Prev< No. 2181> Next  [最新発言に戻る] [過去ログ一覧]