PDA

View Full Version : シフトjis と euc


afbishmill
2002/01/15, 04:28 PM
うちのCGIでカキコしていて発見したのですが…
シフトJISの掲示板でカキコすると「\」が「逆/」(逆スラッシュ???)
になってしまうんですが、EUCの掲示板とかだとちゃんと「\」と
表示されます。これってサーバーがUNIXなことと
関係あるんでしょうか?
それともCGIがそう出来てるのでしょうか?
色々なCGIで試してみましたが、やっぱりシフトJISのとこは
逆スラッシュになります。
また、これはなおせるものなのでしょうか。

お時間がある方教えてください。

Koh
2002/01/15, 05:21 PM
結論から書きます。文字コードを統一しない限り直りません。

原因は、サーバーとも CGI スクリプトとも無関係で、そもそも EUC-JP と Shift_JIS とでは、「¥」と同じ形で表示される半角英数記号と、「\ (バックスラッシュといいます)」と同じ字形で表示される半角英数記号とが、違うコードに割り当てられているせいです。

このへんの話には、ややこしい歴史的背景があり、この場で突っ込んだ説明をすると大変なことになりそうなので、興味のある方は以下の文書群を参照願います。
「ASCIIコードを知ろう」 (http://www.rfs.co.jp/sitebuilder/perl/11/01.html)
「[5] フォントとレイアウト」 (http://www02.so-net.ne.jp/~hat/imail/sec05.html)
「ウェブページを『EUC』で符号化することについて」 (http://www.asahi-net.or.jp/~wq6k-yn/webenc.html)
「ASCIIとANK」 (http://www.asahi-net.or.jp/~ax2s-kmtn/codes.html)

cucu81
2002/01/15, 06:35 PM
というか、¥はフォント指定なしで、\は
外国系のフォントを指定しているだけじゃないの?

IEの場合、英語フォントを指定すると、
英語は、英語フォントで、
日本語は、日本語フォントに
自動的にフォント調整するので、¥→\になっているだけではないかな?

というか\となっているのは何処の掲示板だい?

mstk
2002/01/15, 07:16 PM
IEだと大丈夫なのですが、うちのMozillaだとどちらも¥と表示されてしまいます。
区別する必要がある時は、2バイト文字で書いた方が安全じゃないですかね。

cucu81
2002/01/15, 07:21 PM
Originally posted by mstk
IEだと大丈夫なのですが、うちのMozillaだとどちらも¥と表示されてしまいます。
区別する必要がある時は、2バイト文字で書いた方が安全じゃないですかね。
わかっててわざとやってんだけどもね。
逆に言えば、Mozilla使っている人は、該当の掲示板も、
どちらも問題なく\に見えると言うことだから。

Koh
2002/01/15, 10:12 PM
申し訳ありません、ことはそう単純じゃないですね。
マシン本体の内部コードとか、ブラウザ内での処理などが絡んでくるようです。

以下を body 部分に含む html 文書 (スタイルシートによるフォント指定はなしで) をこしらえてみましたが、ブラウザなどによって表示結果が変わるのですね。<dl>
<div lang="en"><dt>Englsh:</dt><dd>&amp;#165; &amp;amp; &amp;#92;</dd></div>
<div lang="ja"><dt>日本語:</dt><dd>&amp;#165;と&amp;#92;</dd></div>
</dl>ISO-2022-jp や shift_jis の場合English:
 ¥ & \
日本語:
 ¥と¥みたいに、
euc_jp の場合English:
 ¥ & \
日本語:
 ¥と \みたいに表示されるのが、規格的には正解のような気がしますが、うちの環境において期待通りの表示結果が得られたブラウザはゼロでした。どのブラウザでも文字コードによる差はみられなかった代わりに、ブラウザごとに &amp;#92; の扱いがバラバラだったわけです。

いずれにしろ、混乱の元なので \ ( &amp;#92; ) は html 文書や掲示板の書き込みで迂闊に使わないほうが安全そうです。

cucu81
2002/01/15, 10:51 PM
ほぅ、これは不思議だな〜。

なぜにコード165をコピペすると、92になるのだろう。。。
いや、165にすること自体は、Perlだろうとなんだろうと簡単だが、
なぜにCGIでこのような処理が一般的に入らない?

普通92だよな〜。
165を使うとなにか問題でもあるのか?
(単に一般に認識がないだけか。)

ただ、165自体が素で¥でも\でもない
というところが、扱いにくいのか。

cucu81
2002/01/15, 11:00 PM
そんなことは良いとして、とりあえず、
掲示板のコードを変えて問題なさそうなら、
Shift-jisにしとけば、とりあえず
今回の件は良いと言うことか。

Koh
2002/01/15, 11:41 PM
あるいは、掲示板の入口に「半角の \ は混乱の元なので使わないでください」と注意書きをつけるかしてもいいでしょう。
Originally posted by cucu81
なぜにコード165をコピペすると、92になるのだろう。。。日本語版 Microsoft Windows なマシンでは、このへんの内部処理が OS のレベルからして腐っているらしいです。MacOS マシンはどうだか知りませんが、Unix マシンだと上手く設定すれば区別して扱えるという話をきいたことがあります。Originally posted by cucu81
165を使うとなにか問題でもあるのか?
(単に一般に認識がないだけか。)

ただ、165自体が素で¥でも?でもない
というところが、扱いにくいのか。Shift_JIS や iso-2022-jp については、その通りでしょうね。確か何も定義されていない領域なんですよ。従って、多言語対応がちゃんとしてない古めなブラウザの中には、&amp;#165; や &amp;yen; と書いても何も表示されないものもあります。(そういうブラウザは &amp;copy; や &amp;heart; などにも対応してないはず)
厳密にいうと iso-2022-jp についてはエスケープシークェンスの位置次第で iso-2022-jp で定義されている半角英数字と us-ascii オリジナルで定義されている半角英数字とを切り替え入力することも可能らしいですが……。

一方、us-ascii や euc-jp で書かれた html 文書については、&amp;#165; や &amp;yen; に対して¥と同じ字形の文字が、&amp;#92; や単独の \ に対しては\と同じ字形の文字 (バックスラッシュ) が表示されるべきところですが、そう処理してくれないブラウザも残念ながら多いです。

natsuki
2002/01/16, 12:26 AM
シフトJIS掲示板での半角「¥」の入力は出来ました。
IE5、ネスケ6と試してみましたが、
逆スラッシュにはなっとりませんでした。
となるとソフトウェアの問題もあるかもしれんです。

Koh
2002/01/16, 12:57 AM
Originally posted by natsuki
となるとソフトウェアの問題もあるかもしれんです。試しにテスト用コンテンツ (この記事に張ったリンクは2002/02/04付けで消しました) を作ったので、興味のある人は比較対照してみてください。
iso-2022-jp で書いたもの
shift_jis で書いたもの
euc-jp で書いたもの(化けるようならブラウザの文字コード判定の設定をいじってください)

afbishmill
2002/01/16, 02:11 AM
リンクされたサイトに行って来ました(^-^ )
2バイトで書けばちゃんと表示されると言うことですね!
取り敢えず解決、なのですが…
まだまだ分からないことが多いので
教えて頂いたサイトなどをもぅちょっと深く学んでみます。

ありがとうございました(シ_ _)シ

Koh
2002/02/04, 09:38 AM
二つ上の小生の書き込みに張られていたリンクを外し、代わりにこの記事に同じものをzipでアーカイブしたファイルを添付します。