【问题标题】:Apparently Some non standard Characters are seen as regular Characters显然,一些非标准字符被视为常规字符
【发布时间】:2015-08-22 21:47:27
【问题描述】:

我故意使用了一个看似不标准但可以使用的字符:

var ᛨ={};
ᛨ.causeError()

Uncaught TypeError: è.causeError is not a function

显然 ᛨ 字符是 è 字符的一个版本

(一个 utf-8 普通文本字符 a,b,c 是文本)

(非文字☎,®,#,%)

è === http://unicode-table.com/en/00E8/

Encoding      hex             dec (bytes)    dec            binary
UTF-8         C3 A8           195 168        50088          11000011 10101000
UTF-16BE      00 E8           0 232          232            00000000 11101000
UTF-16LE      E8 00           232 0          59392          11101000 00000000
UTF-32BE      00 00 00 E8     0 0 0 232      232            00000000 00000000 00000000 11101000
UTF-32LE      E8 00 00 00     232 0 0 0      3892314112     11101000 00000000 00000000 00000000

ᛨ === http://unicode-table.com/en/16E8/

Encoding      hex            dec (bytes)     dec            binary
UTF-8         E1 9B A8       225 155 168     14785448       11100001 10011011 10101000
UTF-16BE      16 E8          22 232          5864           00010110 11101000
UTF-16LE      E8 16          232 22          59414          11101000 00010110
UTF-32BE      00 00 16 E8    0 0 22 232      5864           00000000 00000000 00010110 11101000
UTF-32LE      E8 16 00 00    232 22 0 0      3893755904     11101000 00010110 00000000 00000000

我没有看到相关性!

如何测试非标准字符以查看它们是否与普通文本字符相关?

我要寻找的关系是什么?

出于兴趣;这个 Unicode 问题是否记录在任何地方?

[这个问题,经过进一步思考,还没有完全解决(见 cmets)]

【问题讨论】:

  • 我真的不认为它应该重要,但这是一个非常有趣的问题:)
  • 是的,我觉得它很有趣!
  • 另外,我刚刚查过了。您仍然可以创建一个名为 ᛨ 的属性和另一个名为 "è" 的属性。错误似乎只是控制台输出的问题。
  • 也许但是,那么控制台为什么要把这两者联系起来呢?
  • 嗯,很明显的联系是 16E8 的第二个字节是 E8,所以如果它被误解为一对单字节字符,你会看到一个 è

标签: javascript text utf-8


【解决方案1】:

它使用一个名为ಠ_ಠ的变量进行测试,错误消息包含“_”(空格下划线空格)。看起来编写错误消息的代码不支持尽可能多的字符。

同样的问题发生在控制台中,所以不是文件编码问题。此外,字符的管理没有任何问题,除了自动错误消息。即使写throw new Error("ಠ_ಠ"); 也没有问题。

这似乎是一个相当具体的错误,但它同时影响 Chrome 和 Firefox。

【讨论】:

  • 我会说我原来的问题是无效的(虽然很有趣)
  • 如果其他人有进一步的见解,请成为我的客人!
【解决方案2】:

è '巧合' 是西方 ANSI 编码中的字符 E8,这也是您的特殊字符的 UTF-16 代码点的第二个字节(顺便说一下,UTF-16 中的 `è 也是如此) .

如果您正在处理源文件:您可能以错误的编码保存文件,可能是 ANSI,也可能是 UTF-16。确保您的源文件以正确的编码保存。 “正确”编码几乎可以是任何东西(尽管推荐使用 UTF-8),只要它与您随文件发送的 Content-Encoding 标头匹配,并且它可以包含您想要放入其中的每个字符。

如果您在控制台上工作:如果只是控制台出现问题,这仍然可以解释问题。在内部,浏览器可能会使用与 UTF-8 不同的编码,因为 UTF-8 传输效率高,但使用起来不方便。它很可能使用 UTF-16(或 UCS2)。然后您的字符将被编码为双字节代码点16 E8。如果控制台尝试将每个字节显示为单独的字符,它会将E8 显示为'è' 并完全跳过16,因为它在历史上是一个 ASCII 控制字符(SYN,表示同步空闲)并且不打算在全部。

【讨论】:

  • 没有文件我只在普通 Chrome 浏览器上使用控制台播放。我认为我们已经接近答案(+1)。也许真正的问题是为什么会跳到 UTF-16 的第二个字节(并且可以)?
  • 见最后一段。控制台可能将该符号显示为两个 (ANSI) 字符,但第一个字符 16 在历史上是一个控制字符,无法由控制台显示。
  • 其实最后一段是很懂的
  • 是的,我希望如此。不过,我不知道解决方案。我找不到设置或纠正他的方法。另一方面,如果你输入正确,也许浏览器也应该正确处理它。根据我目前掌握的信息,我认为这可能是一个错误。
  • 因为实际的 JavaScript 运行时确实可以正确处理多字节字符。所以在内部,浏览器知道变量实际上是用(有效的)名称“ᛨ”调用的。如果你使用一个实际上是非法的字符,比如,你会得到一个不同的错误:“Unexpected token ILLEGAL”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多