JavaScript 中与 Python 的 chr() 对应的函数是什么?

3
JavaScript方法String.fromCharCode()与Python的unichar()方法在以下方面具有相同的行为:
print unichr(213) # prints Õ on the console 
console.log(String.fromCharCode(213)); // prints Õ on the console as well

然而,就我所需而言,我需要一个JavaScript等价于Python函数chr()的函数。是否有这样的JavaScript函数或方法可以使String.fromCharCode()的行为像chr()

也就是说,我需要JavaScript中的某些东西来模仿。

print chr(213) # prints � on the console

3
如果您希望更好地解释您的意图和说明 String.fromCharCode 无法满足您的需求,可以添加更多解释。如果您仅想在控制台中显示Unicode替换字符,可以使用 String.fromCharCode(0xFFFD)。请注意保持原文意思不变,并尽可能使翻译通俗易懂。 - Esailija
(顺便说一句,你不应该使用“print unichr(stuff)”这种写法。) - Julian
2个回答

3

原来你想在node.js中使用原始字节,这里有一个模块。如果你是一个真正的巫师,你可以仅使用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) # 在控制台上显示 �

这段代码打印了一个原始字节 (0xD5),在UTF-8下被解析成无效的UTF-8字节序列,因此显示为替代字符(�)。

这里的UTF-8解释不相关,您可能只想要原始字节。

要在javascript中创建原始字节,可以使用UInt8Array

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

您可以选择将原始字节解释为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 ★

@chessweb 好吧,你没有说你想做什么。我只能从你的问题中得到一个信息,那就是你想写入原始字节并将其解释为UTF-8。所以这就是我的回答。 - Esailija
好吧,我正在开发一个Node.js/HTML5界面,用于Free International Chess Server。在这种情况下,我目前正在移植一种已经测试和工作的加密算法,该算法是用于在该服务器上玩国际象棋时时间戳移动的。Python中的算法利用chr函数编写。我用String.fromCharCode替换了它。但没有起作用。然后我在Python代码中用unichr替换了chr,并注意到它产生了与我的JavaScript端口相同的结果。所以这归结为在JavaScript中找到chr的对应项。 - chessweb
@chessweb 如果你想使用原始字节,就不应该使用String.fromCharCode。特别是在node.js中,你可以使用http://nodejs.org/api/buffer.html。Javascript没有`chr`的对应项,因为它内部只处理utf16字符串。 - Esailija
这个 node-buffer 的东西看起来很有前途。我会试一试的。谢谢。 - chessweb
@Esailija 在IE10、Opera 11.60和Safari 5.1中也支持Typed arrays。您可以省略“不是真正支持”的部分。 - Rob W
显示剩余4条评论

1
如果您想要在标准ASCII表中不存在的每个数字后面添加“方框中的问号”,那么这个小函数怎么样?
function chr(c) {
    return (c < 0 || c > 126) ? '�' : String.fromCharCode(c);
}

不,那不是我的意思。从chr(213)和unichr(213)的控制台输出可以清楚地看出,这些Python函数在128到255的范围内的行为不同。现在,String.fromCharCode(213)发出与unichr(213)相同的输出。因此,String.fromCharCode是unichr的JavaScript对应项。我需要的是chr的JavaScript对应项,以便它对于128到255的输入发出与chr相同的输出。 - chessweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接