javascript - 通过 charCodeAt 比较两个带有特殊字符的字符串

标签 javascript character-encoding

我的目标是创建一种方法,该方法接受两个带有特殊字符的字符串并正确比较它们。我正在努力理解字符编码的逻辑。

所以,我的字符串看起来像:

Häzel - This Girl Is Watching Me

我有这个字符串的两个副本。一个是通过第三方 API 通过 $.ajax() 提供给我的,另一个是我的服务器的反序列化,也使用 $.ajax()。

我的原始字符串,当表示为字符代码时,如下所示:

Array[33]
0: 72
1: 97
2: 776
3: 122
4: 101
5: 108
6: 32
7: 45
8: 32
9: 84
10: 104
11: 105
12: 115
13: 32
14: 71
15: 105
16: 114
17: 108
18: 32
19: 73
20: 115
21: 32
22: 87
23: 97
24: 116
25: 99
26: 104
27: 105
28: 110
29: 103
30: 32
31: 77
32: 101

之后:

Array[32]
0: 72
1: 228
2: 122
3: 101
4: 108
5: 32
6: 45
7: 32
8: 84
9: 104
10: 105
11: 115
12: 32
13: 71
14: 105
15: 114
16: 108
17: 32
18: 73
19: 115
20: 32
21: 87
22: 97
23: 116
24: 99
25: 104
26: 105
27: 110
28: 103
29: 32
30: 77
31: 101

区别在于“ä”在序列化前表示为 [97, 776],序列化后表示为 [228]。

我想知道一些事情:

  • 从这些信息中是否可以清楚地看出正在使用什么编码?我不熟悉这个过程,谷歌搜索发现了很多关于 alt + numpad 组合键的信息,但我不认为这是正确的。
  • 是否可以将我的一根弦“转换”为另一根弦?
  • 是否可以创建一个通用的“比较器”函数来使这两个字符串相等?

在我看来,它们是完全一样的。目前我对编码没有偏好——我只希望两个字符串相等。

最佳答案

字符串是字节序列。因此,除了位模式之外,它不能呈现为任何内容。接下来,角色集开始发挥作用。在这里,您将数字映射到字符,例如 65 映射到 A,97 映射到 a,228 映射到 ä。最后,您需要一种字符编码,它将数字映射为位模式。

对于数字 228,通常的 8 位编码仅使用 0xE4 作为位模式。 UTF-8 编码将使用 0xC3 0xA4 作为位模式,UTF-16 将使用 0x00 0xE4 作为位模式。

因此,为了正确比较字符串,您需要知道它的位模式(字节序列)、它的编码和它的字符集。如果缺少任何字符串,则无法正确比较字符串。

如今,大多数时候都使用 Unicode 作为字符集。如果您只使用非常基本的字符,ASCII 也可以完成这项工作。 ASCII 是 Unicode 的子集,因为前 127 个字符(代码点)是相同的。对于编码,7 位 ASCII 与 UTF-8 相同。

简而言之,如果不知道字符集和字符编码(或者至少知道它们对于两个字符串是相同的),您根本无法比较字符串。

关于javascript - 通过 charCodeAt 比较两个带有特殊字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17605832/

相关文章:

excel - 如何使用 Excel 以 UTF-8 编码打开文本文件?

javascript - Jquery 表转 Excel

javascript - 如何使用 Protractor-jasmine 滚动我的窗口的一部分

linux - 使用 wget 无法读取攻击性安全文件内容

json - 字符集编码 Tomcat Windows/JBoss Linux

C++ 字符编码

java - InputStream和InputStreamReader在读取多字节字符时的区别

javascript - ctrl 单击表格元素时删除默认蓝色边框

javascript - 使用 hammer.js 循环从第一个 if 跳到第二个

javascript - block 作用域声明 let const 函数类在 kriasoft React 样板中的严格模式之外尚不支持