2

ここの表を見ると、実際には機能しない Unicode 文字のエスケープ シーケンスのリストがあります。

たとえば、「%96」は – である必要がありますが、デコードしようとするとエラーが発生します。

decodeURIComponent("%96");
URIError: URI malformed

「–」をエンコードしようとすると、実際には次のようになります。

encodeURIComponent("–");
"%E2%80%93"

インターネットで検索したところ、このページを見ました。これには、それぞれdecodeURIComponentとencodeURIComponentでエスケープとアンエスケープを使用することが記載されています。何を試しても %96 が「–」として表示されず、もちろんこれはうまくいかないため、これは役に立たないようです:

decodeURIComponent(escape("%96));
"%96"

あまり役に立ちません。

JavaScript で "%96" を "–" にするにはどうすればよいですか (遭遇する可能性のあるすべてのユニコード文字のマップをハードコーディングする必要はありません)。

4

3 に答える 3

3

Carl Henderson による「Building Scalable Websites」からの引用として、コミュニティ wiki エントリとして投稿します。この本では、例のかなりの部分を再現しても問題ないと書かれています。「-」の特殊なケースを作成できる場合があります。

function escape_utf8(data) {
        if (data == '' || data == null){
               return '';
        }
       data = data.toString();
       var buffer = '';
       for(var i=0; i<data.length; i++){
               var c = data.charCodeAt(i);
               var bs = new Array();
              if (c > 0x10000){
                       // 4 bytes
                       bs[0] = 0xF0 | ((c & 0x1C0000) >>> 18);
                       bs[1] = 0x80 | ((c & 0x3F000) >>> 12);
                       bs[2] = 0x80 | ((c & 0xFC0) >>> 6);
                   bs[3] = 0x80 | (c & 0x3F);
               }else if (c > 0x800){
                        // 3 bytes
                        bs[0] = 0xE0 | ((c & 0xF000) >>> 12);
                        bs[1] = 0x80 | ((c & 0xFC0) >>> 6);
                       bs[2] = 0x80 | (c & 0x3F);
             }else if (c > 0x80){
                      // 2 bytes
                       bs[0] = 0xC0 | ((c & 0x7C0) >>> 6);
                      bs[1] = 0x80 | (c & 0x3F);
               }else{
                       // 1 byte
                    bs[0] = c;
              }
             for(var j=0; j<bs.length; j++){
                      var b = bs[j];
                       var hex = nibble_to_hex((b & 0xF0) >>> 4) 
                      + nibble_to_hex(b &0x0F);buffer += '%'+hex;
              }
    }
    return buffer;
}
function nibble_to_hex(nibble){
        var chars = '0123456789ABCDEF';
        return chars.charAt(nibble);
}
于 2010-04-07T23:14:06.713 に答える
1

この質問、特にこの回答を参照してください。

UTF-8 バイトをエンコードする代わりに、Unicode UTF-16 コード ポイントをエンコードするための特別な「%uNNNN」形式があります。

Asciiテーブルの 0x96は û

于 2010-04-07T23:12:22.390 に答える