为什么用%c指定的NSString字符被改变了?

时间:2013-06-25 18:05:40

标签: ios utf-8 character-encoding nsstring

我试图测试一些涉及字符串编码之间转换的代码,并在尝试使用无效的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 [已更改]

1 个答案:

答案 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,系统可能会查找一个负值并知道谁知道什么。