3

JavaScript メソッドは、次の意味でString.fromCharCode()Python のメソッドと同じように動作します。unichar()

print unichr(213) # prints Õ on the console 
console.log(String.fromCharCode(213)); // prints Õ on the console as well

ただし、私の目的のためには、Python 関数に相当する JavaScript が必要ですchr()。そのようなJavaScript関数またはのようにString.fromCharCode()動作させる方法はありchr()ますか?

つまり、JavaScriptで模倣するものが必要です

print chr(213) # prints � on the console
4

2 に答える 2

3

したがって、node.js で raw バイトを操作したいだけであることがわかりました。そのためのモジュールがあります。あなたが本当の魔法使いなら、このようなものを JavaScript 文字列だけで動作させることができますが、それは難しく、はるかに効率的ではありません。

var b = new Buffer(1);
b[0] = 213;

console.log(b.toString()); //�


var b = new Buffer(3);
b[0] = 0xE2;
b[1] = 0x98;
b[2] = 0x85;

console.log(b.toString()); //★

print chr(213) # prints � on the console

したがって、これは有効な UTF-8 バイト シーケンスではない UTF-8 で解釈される未加工のバイト ( 0xD5) を出力するため (�)、置換文字 (�) として表示されます。

ここでは UTF-8 としての解釈は関係ありません。生のバイトが必要な場合がほとんどです。

JavaScript で raw バイトを作成するには、UInt8Array.

var a = new Uint8Array(1);
a[0] = 213;

オプションで、raw バイトを utf-8 として解釈できます。

console.log( utf8decode(a)); // "�"

//Not recommended for production use ;D
//Doesn't handle > BMP to keep the answer shorter
function utf8decode(uint8array) {
    var codePoints = [],
        i = 0,
        byte, codePoint, len = uint8array.length;
    for (i = 0; i < len; ++i) {
        byte = uint8array[i];

        if ((byte & 0xF8) === 0xF0 && len > i + 3) {

            codePoint = ((byte & 0x7) << 18) | ((uint8array[++i] & 0x3F) << 12) | ((uint8array[++i] & 0x3F) << 6) | (uint8array[++i] & 0x3F);
            if (!(0xFFFF < codePoint && codePoint <= 0x10FFFF)) {
                codePoints.push(0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD);
            } else {
                codePoints.push(codePoint);
            }
        } else if ((byte & 0xF0) === 0xE0 && len > i + 2) {

            codePoint = ((byte & 0xF) << 12) | ((uint8array[++i] & 0x3F) << 6) | (uint8array[++i] & 0x3F);
            if (!(0x7FF < codePoint && codePoint <= 0xFFFF)) {
                codePoints.push(0xFFFD, 0xFFFD, 0xFFFD);
            } else {
                codePoints.push(codePoint);
            }
        } else if ((byte & 0xE0) === 0xC0  && len > i + 1) {

            codePoint = ((byte & 0x1F) << 6) | ((uint8array[++i] & 0x3F));
            if (!(0x7F < codePoint && codePoint <= 0x7FF)) {
                codePoints.push(0xFFFD, 0xFFFD);
            } else {
                codePoints.push(codePoint);
            }
        } else if ((byte & 0x80) === 0x00) {
            codePoints.push(byte & 0x7F);
        } else {
            codePoints.push(0xFFFD);
        }
    }
    return String.fromCharCode.apply(String, codePoints);
}

あなたがしようとしている可能性が最も高いのは、バイトをutf8として解釈しようとすることとは何の関係もありません。

もう一つの例:

//UTF-8 For the black star U+2605 ★:
var a = new Uint8Array(3);
a[0] = 0xE2;
a[1] = 0x98;
a[2] = 0x85;
utf8decode(a) === String.fromCharCode(0x2605) //True
utf8decode(a) // ★

Python 2.7 (Ubuntu) の場合:

print chr(0xE2) + chr(0x98) + chr(0x85)
#prints ★
于 2012-07-29T11:01:45.040 に答える
1

標準の ASCII テーブルにないすべての数値に対してこの「ボックス内の疑問符」が必要な場合は、この小さな関数はどうですか?

function chr(c) {
    return (c < 0 || c > 126) ? '�' : String.fromCharCode(c);
}
于 2012-07-29T10:49:29.710 に答える