我的目标是创建一个方法,它接受两个带有特殊字符的字符串并正确地比较它们。我正在努力理解字符编码的后勤。
所以,我的字符串看起来像:
Häzel - 这个女孩在看着我
我有两个这个字符串的副本。一个是通过$ .ajax()通过第三方API提供给我的,另一个是来自我的服务器的反序列化,也使用$ .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]。
我想知道一些事情:
在我看来,他们完全一样。此时我对编码没有偏好 - 我只希望两个字符串是等号的。
答案 0 :(得分:2)
字符串是一个字节序列。因此,除了位模式之外,它不能被渲染为任何东西。接下来,一个字符集开始发挥作用。在这里,您将数字映射到字符,例如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相同。
所以简而言之,在不知道字符集和字符编码的情况下(或者至少知道它们对于两个字符串都是相同的),你根本无法比较字符串。