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)を使う手もありますね。

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