【问题标题】:How to get the correct element from a unicode string?如何从 unicode 字符串中获取正确的元素?
【发布时间】:2019-05-31 15:36:33
【问题描述】:

我想使用索引从 unicode 字符串中获取特定字母。但是,它并没有按预期工作。

例子:

var handwriting = `????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1234567890`
var normal = `abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890` 

console.log(normal[3]) // gives 'd' but
console.log(handwriting[3]) // gives '�' instead of '????'

长度也不能按预期工作 normal.length 给出正确的值 62handwriting.length 给出 114。

索引未按预期工作。如何访问 unicode 数组的元素?

我在 python 上试过了,它运行良好,但在 Javascript 中它不起作用。

我需要 unicode 字符串中的确切字符,例如 'd' '????' 的预期输出对于索引 3

【问题讨论】:

  • 如您所见,unicode 字符很少是单个字节。您需要某种方法来解析 unicode 字节并从中挑选“字符”。
  • @phuzi 挑选字符是这里真正的问题。
  • 注意:这不是手写(它是数学符号),并且您不应该使用 Unicode 进行格式化:您会产生更多问题。 Unicode 是关于语义的。使用字体(和标记)进行格式化。您可以使用标准的 Unicode 分解来从数学到字母(更通用)。

标签: javascript unicode


【解决方案1】:

在 Javascript 中,字符串是 16 位代码点的序列。由于这些字符是在基本多语言平面之上编码的,这意味着它们由一对代码点表示,也称为代理对。

Reference

? 的 Unicode 编号是 U+1D586。并且 0x1D586 大于 0xFFFF (2^16)。所以,? 由一对代码点表示,也称为代理对

console.log("?".length)
console.log("?" === "\uD835\uDD86")

一种方法是使用扩展语法或Array.from() 创建一个字符数组,然后获取您需要的索引

var handwriting = `????????????????????????????????????????????????????1234567890`

console.log([...handwriting][3])
console.log(Array.from(handwriting)[3])

【讨论】:

  • ……直到没有。尝试[...'?‍❤️‍?‍?'].length,表达式返回 8 而不是人类期望的 1。展开计数字符,而不是字素,请参阅 stackoverflow.com/a/51422499/46395>。我希望该语言及其设计者能够认真对待 Unicode,但他们没有,所以程序员必须受苦。
  • @daxim 很好发现。我在 unicode 上阅读的越多,我就越困惑。如果我在控制台中粘贴上面带有表情符号的字符串,我会看到一个 \u200D 空白空间。那是表情符号的一部分吗?为什么每个表情符号有 3 个代码点
  • @adiga - 不仅仅是表情符号,任何带有组合标记的东西都有同样的问题。例如,[..."Français"][4]c(因为我写它时使用了 c 后跟一个用于 cedille 的组合标记,而不是使用组合的 ç 字符)。这……不是很有趣。 :-D normalize 可以在有一个等效字符但通常没有的情况下提供帮助。
【解决方案2】:

一个 unicode 字符看起来像 '\u00E9' 所以如果你的字符串更长,这是正常的。 要获得 unicode 字符串的实际长度,您必须将其转换为数组:

let charArray = [...handwriting]
console.log(charArray.length) //=62

数组中的每一项都是字符串的一个字符。 charArray[3] 将返回与 '?' 对应的 unicode char

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 2016-05-26
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多