JavaScriptで書くとIE4.5で文字化けします

[上に] [前に] [次に]
[E-Mail] 2000/02/17(木) 07:51:02
Pealで、

$moji = "人 ";
print "Content-type: application/x-javascript\n\n";
print "document.write('$moji')";

……のように書いたものを、HTML中にJavaScriptで、

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="xxx.cgi">
</SCRIPT>

……のようにして書き出すと、IE4.5のみで全角文字が文字化けしてしまいます。
<META>タグと<SCRIPT>タグに『CHARASET="Shift_JIS"』を
入れてみたのですが、効果がないようです。(; ;)
もし何か解決法があれば、教えていただけると幸いです。
よろしくお願いいたします。

コウノトリ 2000/02/17(木) 11:14:04
MacのIE4.5はスクリプト中の日本語をUTF-8(だっけ?)に勝手にエンコードして出力しちゃうから
HTMLがShift_JISだと化けるんですよ。
外部スクリプトを勝手にエンコードしちゃう仕様はWinのIEの一部のバージョンにもあって
それぞれ仕様が異なるのでとても面倒です。
日本語を使わないか、一部の環境を切り捨てるのが賢明ですね。

関係ないけど気になった点・・・
なんでCGIのConten-typeはapplication/x-javascriptでSCRIPTタグの中はtext/javascriptなの?
普通は両方ともtext/javascriptにします。

LoveSong 2000/02/17(木) 15:35:55
すいません・・・質問と関係ないのですが教えてください・・・

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="xxx.cgi">
</SCRIPT>
なんですけど・・・SCRIPTタグでcgiを呼び出せるのでしょうか?(^^;;
これってSSIと同じ動作をするのでしょうか?(^^;;
すいません 教えてくださいm(__)m

EMI 2000/02/17(木) 15:57:43
<img src="xxx.cgi">
と、同じことでしょう。
要するに、出力結果さえ要求に合えばCGIはどんなドキュメントでも出力できます。
たとえば、次のようなことも可能でしょう。
<link rel="stylesheet" type="text/css" href="xxx.cgi">

後は、CGIプログラムが要求に合う出力をしているかどうかです。

コウノトリ 2000/02/17(木) 15:58:22
>これってSSIと同じ動作をするのでしょうか?(^^;;

クライアント側からの外見は同じですね。
技術的には全然違いますが、非SSI環境での疑似SSI実現方法として有用です。

三原克大 [E-Mail] 2000/02/17(木) 18:04:57
これは FAQ になりそうですね

IE Macintosh Edition 独特の仕様
../200002/00020121.htm
IE 5.0 と IE 5.01 の間の仕様変更
../199912/99120272.htm

この制限を乗り越えるためにいろいろな技巧が考案されていますが、
私はいっそ JIS から派生したエンコードを捨てることをお勧めします。本気で。
繰り返しになりますが、JavaScript では文字列リテラル内で Unicode 中の任意の文字を
ASCII による hex 表記で指定するエスケープ表現が定義されました。
\u hex hex hex hex (実際には空白は無し。上の回答で示した % を使う表記法は間違いです)
これで Unicode 中の任意の一文字を表現できます。

ブラウザの不備をプログラマがかぶる必要は無いとか、
エディタで見えないのは不気味だとか、いろいろ意見はあると思いますが、
Netscape Communicator 4.06 以降と
IE 4.0 以降と IE Macintosh Edition 4.5 以降で
実用できるエスケープ表現は
実はインストールベースで見たときに
正しく表示できるブラウザの数をもっとも多くする選択だと思われるのです。

これから事態が好転しそうなら待てばいいのですが、
もう信じられません。

K 2000/02/18(金) 06:39:25
みなさま、すばやいレスをいただき、たいへんありがとうございます。
(あ!PerlがPealになっていましたね・・・)

>コウノトリさん
ブラウザ側の仕様とは知りませんでした。
勝手にエンコードされるからだったんですね。
通りでECUに変えても同様に文字化けするわけです・・・(^-^;
Conten-typeはapplication/x-javascriptは、
よそ様のスクリプトを何も考えずそのまま流用させていただいて、
偶然うまくいったので、これでいいものと思い込んでいました。
ご指摘ありがとうございます。

>三原克大さん
すみません、全くのドシロウトですので、いろいろ調べながら拝見したのですが、
よくわからなくて・・・。
hexとは何でしょうか。ATOKの文字パレットの中に、Unicode表というものがあり、
それによると、たとえば『人』は『4EBA』なのですが、
これをASCII による hex 表記で指定するには、どのように書けばよいのでしょうか。
すみませんが、もしわかればよろしくお願いいたします。m(__)m


----日本語表記を諦めようかという消極的なことを考えておりますが;

三原克大 [E-Mail] 2000/02/18(金) 12:30:56
> hexとは何でしょうか。ATOKの文字パレットの中に、Unicode表というものがあり、
> それによると、たとえば『人』は『4EBA』なのですが、
> これをASCII による hex 表記で指定するには、どのように書けばよいのでしょうか。

hex とは16進数表記のこと(ちょっと不安)。
一桁で16(2の4乗)まで表す数字を 0-9,A,B,C,D,E,F で書く方法です。
ATOK の文字パレットが示す数字がまさにそれです。
JavaScript の文字列リテラルで "人" をエスケープ表現しようとすると、
  var hito = "\u4EBA"; // "\u4EBA" == "人"

普通はツールを使って作ります。人手ではまず間違えますから。
JDK (Sun が配布する、Java 開発キット) に付属する
native2ascii しか知りませんが、それで十分です。
native2ascii の使い方はドキュメント(別にダウンロードしなければならない…)
を参照してください。

三原克大 [E-Mail] 2000/02/18(金) 12:38:00
> JDK (Sun が配布する、Java 開発キット) に付属する
> native2ascii しか知りませんが、それで十分です。
当事者である Mac ユーザには Sun からは提供されていませんでしたね。
http://developer.apple.com/java/
http://developer.apple.com/sdk/index.html#MRJ
を参照してください(全文英語だよ…)。

K 2000/02/19(土) 06:59:28
[[解決]]
三原さん、たいへんていねいに教えていただいてありがとうございます!
hexのこと、よく分かりました。
教わったとおり、全角部分を"\u"+"Unicode4桁"で表記したところ、
MacIE4.5でも文字化けせず、NC4.7でも同じように表示されました。
……感動ものでした。(笑)
native2asciiの情報もありがとうございました。
上記のページは英語なので、まだちゃんと読んでおりませんが、
今後、参考にさせていただきたいと思います。
本当にありがとうございました。(^^)

[上に] [前に] [次に]