如何反转String.fromCharCode?

70
"String.fromCharCode(72)" 可以得到字母 H。如何从字母 H 获得数字 72?

5
问题中的代码才是我来这里的原因,而不是答案。谢谢! - B''H Bi'ezras -- Boruch Hashem
6个回答

76
'H'.charCodeAt(0)

1
嗨,感谢您提供的解决方案。它只适用于英文单词吗?当我尝试查找泰米尔语单词的字符代码时,它无法正常工作。如果我使用String.fromCharCode(2974); 它会返回字符'ஞ',同样地,如果我使用'ஞ' .charCodeAt(0),我得到38,那是'&'的代码,为什么会这样呢? - shanish
1
@shanish:如果你写String.fromCharCode(2974).charCodeAt(0),你会得到什么?(这对我有效。)也许你的编辑器和/或源文件不支持Unicode。 - Lightness Races in Orbit

10

使用 charCodeAt:

var str = 'H';
var charcode = str.charCodeAt(0);

8

@Silvio的答案只适用于编码点最大到0xFFFF的情况(这也是String.fromCharCode可以输出的最大值)。你不能总是假设字符的长度为1:

''.length
-> 2

这里有一个可行的方案:

var utf16ToDig = function(s) {
    var length = s.length;
    var index = -1;
    var result = "";
    var hex;
    while (++index < length) {
        hex = s.charCodeAt(index).toString(16).toUpperCase();
        result += ('0000' + hex).slice(-4);
    }
    return parseInt(result, 16);
}

如何使用它:

utf16ToDig('').toString(16)
-> "d800df30"

(Inspiration from https://mothereff.in/utf-8)


6
你可以像这样定义自己的全局函数:
function CHR(ord)
{
    return String.fromCharCode(ord);
}

function ORD(chr)
{
    return chr.charCodeAt(0);
}

然后像这样使用它们:
var mySTR = CHR(72);

或者

var myNUM = ORD('H');

(如果您想在代码中多次使用它们和/或大量使用它们。)

3
不要再使用我的建议。我强烈建议您使用一个_object_来包装您的函数,而不是全局定义它们。 - David Refoua

1

String.fromCharCode 可以接受多个参数,因此以下写法是合法的:

const binaryArray = [10, 24] // ...
str = String.fromCharCode(...binaryArray)

如果你正在寻找与此相反的内容(就像我一样),这可能会很有用:

const binaryArray = str
  .split('')
  .reduce((acc, next) =>
    [...acc, next.charCodeAt(0)],
    []
  )

0

如果您需要考虑编码,请注意String对象的charCodeAt方法将默认使用utf16编码。您可以使用string_decoder对象和Node.js Buffer对象的编码参数来应用特定的编码。

charCodeAt方法仅提供ascii/utf-16编码,即使是utf-8编码的String对象也是如此:

str=new String(new Buffer([195,169]))
// -> [String: 'é']
str.charCodeAt(0)
// -> 233

使用fromCharCode构建字符串不正确,因为它期望UTF-16

myStr=String.fromCharCode(50089, 65, 233)
// -> '쎩Aé'
Buffer.from(myStr, 'utf-8')
// -> <Buffer ec 8e a9 41 c3 a9>
Buffer.from(myStr, 'ascii')
// -> <Buffer a9 41 e9>
myStr.charCodeAt(0)
// -> 50089
myStr.charCodeAt(2)
// -> 233

这里有一个简单的例子,用于编码和解码UTF8字节和ASCII字节:

var dec=new string_decoder.StringDecoder('utf-8');
dec.write(Buffer.from([65,67,195,169,98]));
// -> 'ACéb'
var theBytes=new Buffer('aéé','utf-8'); 
// -> <Buffer 61 c3 a9 c3 a9>

var dec=new string_decoder.StringDecoder('ascii')
dec.write(Buffer.from([65,67,195,169,98]))
// -> 'ACC)b'
var theBytes=new Buffer('aéé','ascii')
// -> <Buffer 61 e9 e9>

StringDecoder.write 方法将从提供的字节缓冲区返回一个 String 对象。

Buffer 对象的编码参数为您提供了一种获取以提供的字符串编码的字节填充的 Buffer 对象的方法。

因此,要获取字符 'H' 的 ASCII 编码:

new Buffer('H','ascii');
// -> <Buffer 48>
new Buffer('H','ascii')[0];
// -> 72

这样,您也可以像这样处理多字节编码字符:

new Buffer('é','ascii');
// -> <Buffer e9>
arr=new Buffer('é','ascii');
// -> <Buffer e9>
code=arr.readUIntBE(0,arr.length);
// -> 233
code.toString(16);
// -> 'e9'

new Buffer('é','utf-8');
// -> <Buffer c3 a9>
arr=new Buffer('é','utf-8');
// -> <Buffer c3 a9>
code=arr.readUIntBE(0,arr.length);
// -> 50089
code.toString(16)
// -> 'c3a9'

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