如何获取 Javascript 中字符的 Unicode 代码点?

Posted

技术标签:

【中文标题】如何获取 Javascript 中字符的 Unicode 代码点?【英文标题】:How to get the Unicode code point for a character in Javascript? 【发布时间】:2018-06-09 02:28:53 【问题描述】:

我正在使用条形码扫描仪读取我网站上的条形码(该网站是用 OpenUI5 制作的)。

扫描仪就像一个键盘,可以输入它所读取的字符。在打字的结尾和开头,它使用一个特殊字符。这些字符对于每种类型的扫描仪都是不同的。

一些可能的字符是:

█ ▄ – —

在我的代码中,我使用if (oModelScanner.oData.scanning && oEvent.key == "\u2584") 来检查来自扫描仪的输入是否为▄。

有什么方法可以从该字符中获取 \uHHHH 样式的代码? (其中 HHHH 是字符的十六进制代码)

我尝试了charCodeAt,但这会返回十进制代码。

使用codePointAt examples,他们将我需要的代码变成十进制代码,所以我需要反过来。

【问题讨论】:

【参考方案1】:

javascript 字符串有一个 codePointAt 方法,它为您提供表示 Unicode 点值的整数。如果您希望将整数格式化为四位十六进制数字序列(如 Nikolay Spasov 的响应),则需要使用该数字的基数 16(十六进制)表示。

var hex = "▄".codePointAt(0).toString(16);
var result = "\\u" + "0000".substring(0, 4 - hex.length) + hex;

但是,如果您的关键代码点整数与预期的代码点匹配,您可能会更容易直接检查

oEvent.key.codePointAt(0) === '▄'.codePointAt(0);

请注意,“符号相等”实际上可能更棘手:一些符号是由代理对定义的(您可以将其视为定义为四个十六进制数字序列的两半的组合)。

因此,我建议使用专门的库。

您可以在relevant article by Mathias Bynens 中找到更多详细信息

【讨论】:

codePointAt 不返回十进制的代码点。它返回只是数字。无论是十进制还是十六进制,只有稍后在某个地方打印该数字时才会变得相关。 这是正确的:一个数字有一个给定的值,独立于它的一个表示使用的基数。然而,在比较的上下文中,数字的表示也很重要,例如:56 !== 0x56 (86) 但更重要的是 '\u0056'.codePointAt(0) !== 56,这常常令人困惑跨度> 如果你的代码点大于FFFF怎么办?例如,'?'.codePointAt(0).toString(16) 返回'1000a'【参考方案2】:
var hex = "▄".charCodeAt(0).toString(16);
var result = "\\u" + "0000".substring(0, 4 - hex.length) + hex;

【讨论】:

【参考方案3】:

如果你想打印一个字符的多个代码点,例如一个表情符号,你可以这样做:

const facepalm = "??‍♂️";
const codePoints = Array.from(facepalm)
  .map((v) => v.codePointAt(0).toString(16))
  .map((hex) => "\\u" + hex + "");
console.log(codePoints);

["\u1f926", "\u1f3fc", "\u200d", "\u2642", "\ufe0f"]

如果您对??‍♂️的组件和长度有疑问,请查看this article。

【讨论】:

以上是关于如何获取 Javascript 中字符的 Unicode 代码点?的主要内容,如果未能解决你的问题,请参考以下文章

javascript 如何在JavaScript中获取查询字符串值?

如何从字符串中获取 4 个 javascript 中邮政编码的序号?

如何获取 Javascript 中字符的 Unicode 代码点?

如何在 JavaScript 中获取 innerHTML(总字符)的长度?

如何在 JavaScript 中获取查询字符串值?

如何在 JavaScript 中获取查询字符串值?