IEとNNのescapeの違いについて
[上に]
[前に]
[次に]
babyA
2000/05/28(日) 21:21:06
IEとNNのescapeの違いを吸収する苦肉の策として
NNでもIEと同様にescapeできるように以下のようにしました。
WindowsのNN4では確認できたのですけれどmacなど他のプラットホームでも
動作するものでしょうか?
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
↑これを指定した上で
function escape2(str)
{
HexT = '0123456789ABCDEF';
ret = '';
for ( i = 0; i < str.length; i++ )
{
c = str.charAt(i);
if ( c.search(/[\*\-\.0-9A-Z_a-z@]/) < 0 )
{
cc = c.charCodeAt(0);
ccc = '';
while ( cc > 0 )
{
ccc = HexT.charAt(cc & 0xf) + ccc;
cc >>>= 4;
}
if ( ccc.length == 0 ) ccc = '00';
else if ( ccc.length % 2 ) ccc = '0' + ccc;
if ( ccc.length == 4 ) ccc = '%u' + ccc;
else ccc = '%' + ccc;
ret += ccc;
}
else ret += c;
}
return ret;
}
function unescape2(str)
{
sub = str;
ret = '';
while ( (n = sub.search(/(%u([\dA-F]{4})|%([\dA-F]{2}))/i)) >= 0 )
{
ret += sub.substring(0, n) +
String.fromCharCode(parseInt('0x' + RegExp.$2 + RegExp.$3));
sub = sub.substring(n + RegExp.$1.length, sub.length);
}
ret += sub;
return ret;
}
TOM neko
2000/05/29(月) 01:24:56
画期的ですね。Mac版NC4.5と4.7では動作しました。
仕組みがよく分からないので、解説希望です。
babyA
2000/05/29(月) 06:12:19
TOM nekoさんありがとうございました。
NNでは<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
を書いておくとcharCodeAtでUnicodeが返り、書かないと普通に文字コードが返るというのが
仕組みというかみそですね。(charsetはEUCでもかまいません)
charCodeAtがなぜこんな動きをするのかはわかりませんが。
VBScriptを使えば文字列をSJISに変換できるので↓のようにしても
よさげですね。(Win&IE5以外では未確認です)
<SCRIPT LANGUAGE="VBScript">
<!--
Function CharCode(Ch)
CharCode = Hex(Asc(Ch))
End Function
Function FromCharCode(Ch)
FromCharCode = Chr(CInt("&H" & Ch))
End Function
-->
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function IsUrlCode(n)
{
if ( n == 0x2A || n == 0x2D || n == 0x2E ||
( n >= 0x30 && n <= 0x39 ) || ( n >= 0x41 && n <= 0x5A ) ||
n == 0x5F || ( n >= 0x61 && n <= 0x7A ) )
return 1;
return 0;
}
function HexB(n)
{
HexT = "0123456789ABCDEF";
return HexT.charAt((n >>> 4) & 0xf) + HexT.charAt(n & 0xf);
}
function Escape(str)
{
ret = '';
if ( document.all )
{
for ( i = 0; i < str.length; i++ )
{
c = "0x" + CharCode(str.charAt(i));
cc = '';
while ( c > 0 )
{
if ( IsUrlCode(c & 0xff) )
cc = String.fromCharCode(c & 0xff) + cc;
else
cc = "%" + HexB(c & 0xff) + cc;
c >>>= 8;
}
ret += cc;
}
}
else ret = escape(str);
return ret
}
function Unescape(str)
{
sub = str;
ret = '';
if ( document.all )
{
while ( (n = sub.search(/(%([89A-Fa-f][0-9A-Fa-f])%([0-9A-Fa-f][0-9A-Fa-f]))/)) >= 0 )
{
ret += sub.substr(0, n) + FromCharCode(RegExp.$2 + RegExp.$3);
sub = sub.substr(n + RegExp.$1.length, sub.length);
}
ret += sub;
sub = ret;
ret = ''
while ( (n = sub.search(/(%([0-9A-Fa-f][0-9A-Fa-f]))/)) >= 0 )
{
ret += sub.substr(0, n) + FromCharCode(RegExp.$2);
sub = sub.substr(n + RegExp.$1.length, sub.length);
}
ret += sub;
}
else ret = unescape(str);
return ret
}
</SCRIPT>
JavaScriptでVBScriptのFunctionを呼んでもいいのかはわかりませんが・・・
TOM neko
2000/05/30(火) 02:24:51
なるほど。charCodeAt で Unicode が返るんですか。charset指定と関係ある
のは、間違いがないように確実に文字コードを知る必要があるからでしょう
か。NNも4からはUnicodeページ対応ですから、Unicodeの認識は出来るはずですが、隠れ
たところでも対応してたんですね。
VBScript 版は、MacのIE4.5ではFunctionが認識されませんでした。残念です。
babyA
2000/05/30(火) 05:46:35
[[解決]]
MacのIEってVBScript×だったんですか。
やはり最初の方法でUnicodeのescape使ったほうがいいみたいですね。
TOM neko
2000/05/31(水) 01:29:03
>MacのIEってVBScript×だったんですか。
さあ、どうなんでしょう。 VBScriptで記述したFunctionが使えなかったこと
だけしかわからないです。
最初の方法ですが、16進数にするならtoString(16)を使う手もありますね。
[上に]
[前に]
[次に]