68user's page 掲示板

Prev< No. 2181〜2184> 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さんが正しい知識を教えようとしてくれる気持ちはとてもありがたいです。

No. 2182 # シイ 2001/10/06 (土) 13:36:53
シイ

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2183 # shii 2001/10/06 (土) 13:43:10
すみません。下の書込は私,椎です。
今回のことがあって,名前のような文字数が少ないフォームへの
日本語の記入に抵抗を感じたので,
これから椎はやめてshiiにしようと思います。

No. 2184 # 68user 2001/10/08 (月) 00:53:21
>>2178 SA
> inet_aton(hostname)になっていますがこれをinet_aton (ipaddres)
> にしても問題はないのでしょうか?
問題ないと思います。FreeBSD では inet_aton と inet_addr は同じ
関数になってます。
# http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/inet_addr.c?rev=1.12.2.1

>>2179 /tk
> @a[0] はスライスです。
ん〜、(@a)[0] とは違うということですか?

>>2179 /tk
> 一致した場合は undef では?
>>2181
> ・getcode()では,半角カナは文字コードの自動認識の判断対象からはずされる
そうでしたっけ…。昔 jcode.pl を読んだときはそうじゃなかった
ような気がしますが、読み違えていたのかもしれません。

> 今は,「$strに全角文字を数個追加して,コンバート後にそれを除く」と
> いうことを考えています。
追加する全角文字のエンコーディングを EUC-JP にするか、Shift_JIS に
するかが問題です。どちらか決めるためには追加対象文字列のエンコーディングを
自動判別しなきゃいけません。で、それが正確にはできないので…と堂々めぐりです。

まぁ、元のフォームが EUC-JP であるということなので、
    /([\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])*/
にマッチすれば EUC-JP として解釈できる文字列である、ということですから
無変換、でいいと思います。
# jcode.pl は汎用ライブラリですからそうもいきませんが。

> すみません。下の書込は私,椎です。
名前の部分にカーソルがある状態で Enter を押しても書き込み
しないようにすればよいのかな? (どうやるのかさっぱりわかりません)

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