我试图测试一些涉及字符串编码之间转换的代码,并在尝试使用无效的UTF-8序列创建一个NSString时发现了这种现象:
char before = 0xa1;
NSString *s = [NSString stringWithFormat:@"%c",before];
char after = [s characterAtIndex:0]; // = 0xb0
对于0x80-0xFF范围内的大多数(但不是全部)字符,NSString中的字符与我指定的字符不同。
有人知道为什么会这样吗?
以下是所有可能的char值的前后值:
1 - > 1
2 - > 2
3 - > 3
4 - > 4
5 - > 5
6 - > 6
7 - > 7
8 - > 8
9 - > 9
a - >一个
b - > B'/ P>
c - > ç
d - > d
e - > ë
f - > ˚F
10 - > 10
11 - > 11
12 - > 12
13 - > 13
14 - > 14
15 - > 15
16 - > 16
17 - > 17
18 - > 18
19 - > 19
1a - > 1A
1b - >图1b
1c - > 1C
1d - > 1D
1e - > 1E
1f - > 1F
20 - > 20
21 - > 21
22 - > 22
23 - > 23
24 - > 24
25 - > 25
26 - > 26
27 - > 27
28 - > 28
29 - > 29
2a - >图2a
2b - >图2b
2c - >图2c
2d - > 2D
2e - > 2E
2f - > 2F
30 - > 30
31 - > 31
32 - > 32
33 - > 33
34 - > 34
35 - > 35
36 - > 36
37 - > 37
38 - > 38
39 - > 39
3a - >图3a
3b - >图3b
3c - >图3c
3d - > 3D
3e - >图3e
3f - > 3F
40 - > 40
41 - > 41
42 - > 42
43 - > 43
44 - > 44
45 - > 45
46 - > 46
47 - > 47
48 - > 48
49 - > 49
4a - >图4a
4b - >图4b
4c - >图4c
4d - >图4d
4e - >图4e
4f - > 4F
50 - > 50
51 - > 51
52 - > 52
53 - > 53
54 - > 54
55 - > 55
56 - > 56
57 - > 57
58 - > 58
59 - > 59
5a - >图5a
5b - >图5b
5c - >图5c
5d - >图5d
5e - >图5e
5f - >图5f
60 - > 60
61 - > 61
62 - > 62
63 - > 63
64 - > 64
65 - > 65
66 - > 66
67 - > 67
68 - > 68
69 - > 69
6a - >图6a
6b - >图6b
6c - >图6c
6d - >图6d
6e - >图6e
6f - > 6F
70 - > 70
71 - > 71
72 - > 72
73 - > 73
74 - > 74
75 - > 75
76 - > 76
77 - > 77
78 - > 78
79 - > 79
7a - >图7a
7b - >图7b
7c - >图7c
7d - > 7D
7e - >图7e
7f - > 7F
80 - > c4 [已更改]
81 - > c5 [已更改]
82 - > c7 [已更改]
83 - > c9 [已更改]
84 - > d1 [已更改]
85 - > d6 [已更改]
86 - > dc [已更改]
87 - > e1 [已更改]
88 - > e0 [已更改]
89 - > e2 [已更改]
8a - > e4 [已更改]
8b - > e3 [已更改]
8c - > e5 [已更改]
8d - > e7 [已更改]
8e - > e9 [已更改]
8f - > e8 [已更改]
90 - > ea [已更改]
91 - > eb [已更改]
92 - > ed [已更改]
93 - > ec [已更改]
94 - > ee [已更改]
95 - > ef [已更改]
96 - > f1 [已更改]
97 - > f3 [已更改]
98 - > f2 [已更改]
99 - > f4 [已更改]
9a - > f6 [已更改]
9b - > f5 [已更改]
9c - > fa [已更改]
9d - > f9 [已更改]
9e - > fb [已更改]
9f - > fc [已更改]
a0 - > 2020 [已更改]
a1 - > b0 [已更改]
a2 - > A2
a3 - > A3
a4 - > a7 [已更改]
a5 - > 2022 [已更改]
a6 - > b6 [已更改]
a7 - > df [已更改]
a8 - > ae [已更改]
a9 - > A9
aa - > 2122 [已更改]
ab - > b4 [已更改]
ac - > a8 [已更改]
ad - > 2260 [已更改]
ae - > c6 [已更改]
af - > d8 [已更改]
b0 - > 221e [已更改]
b1 - > B1
b2 - > 2264 [已更改]
b3 - > 2265 [已更改]
b4 - > a5 [已更改]
b5 - > B5
b6 - > 2202 [已更改]
b7 - > 2211 [已更改]
b8 - > 220f [已更改]
b9 - > 3c0 [已更改]
ba - > 222b [已更改]
bb - > aa [已更改]
bc - > ba [已更改]
bd - > 3a9 [已更改]
是 - > e6 [已更改]
bf - > f8 [已更改]
c0 - > bf [已更改]
c1 - > a1 [已更改]
c2 - > ac [已更改]
c3 - > 221a [已更改]
c4 - > 192 [已更改]
c5 - > 2248 [已更改]
c6 - > 2206 [已更改]
c7 - > ab [已更改]
c8 - > bb [已更改]
c9 - > 2026 [已更改]
ca - > a0 [已更改]
cb - > c0 [已更改]
cc - > c3 [已更改]
cd - > d5 [已更改]
ce - > 152 [已更改]
cf - > 153 [已更改]
d0 - > 2013 [已更改]
d1 - > 2014 [已更改]
d2 - > 201c [已更改]
d3 - > 201d [已更改]
d4 - > 2018年[已更改]
d5 - > 2019 [已更改]
d6 - > f7 [已更改]
d7 - > 25ca [已更改]
d8 - > ff [已更改]
d9 - > 178 [已更改]
da - > 2044 [已更改]
db - > 20ac [已更改]
dc - > 2039 [已更改]
dd - > 203a [已更改]
de - > fb01 [已更改]
df - > fb02 [已更改]
e0 - > 2021 [已更改]
e1 - > b7 [已更改]
e2 - > 201a [已更改]
e3 - > 201e [已更改]
e4 - > 2030 [已更改]
e5 - > c2 [已更改]
e6 - > ca [已更改]
e7 - > c1 [已更改]
e8 - > cb [已更改]
e9 - > c8 [已更改]
ea - > cd [已更改]
eb - > ce [已更改]
ec - > cf [已更改]
ed - > cc [已更改]
ee - > d3 [已更改]
ef - > d4 [已更改]
f0 - > f8ff [已更改]
f1 - > d2 [已更改]
f2 - > da [已更改]
f3 - > db [已更改]
f4 - > d9 [已更改]
f5 - > 131 [已更改]
f6 - > 2c6 [已更改]
f7 - > 2dc [已更改]
f8 - > af [已更改]
f9 - > 2d8 [已更改]
fa - > 2d9 [已更改]
fb - > 2da [已更改]
fc - > b8 [已更改]
fd - > 2dd [已更改]
fe - > 2db [已更改]
ff - > 2c7 [已更改]
答案 0 :(得分:1)
尝试使用:
unichar before = 0xa1;
NSString *s = [NSString stringWithFormat:@"%C",before];
unichar after = [s characterAtIndex:0];
NSLog(@"Read back char was %C", after);
技术上,“char”tpe应为0-127。 UTF8使用两个更高的位,因此它有点未定义单个“0xFF”将生成什么。当你使用stringWithFormat时,字符被提升为整数,所以你的0xA0变成了0xFFFFFFA0,系统可能会查找一个负值并知道谁知道什么。