叫做unicode表示形式是什么?

时间:2012-05-04 07:54:32

标签: objective-c cocoa-touch unicode normalization unicode-normalization

我一直在讨论这个问题,从服务器返回的JSON UTF-8字符串包含这样的unicode对:

  

\ u00c3 \ u00bc

正在呈现为两个单独的字符。但是,它应该呈现为单个字符。根据我发现at this link的表格,这里有一些例子:

0xc3,0xa0 agrave
0xc3,0xa1 aacute
0xc3,0xa2 acircumflex
0xc3,0xa3 atilde
0xc3,0xa4 adiaeresis
0xc3,0xa5 aring
0xc3,0xa6 ae
0xc3,0xa7 ccedilla
0xc3,0xa8 egrave
0xc3,0xa9 eacute
0xc3,0xaa ecircumflex
0xc3,0xab ediaeresis
0xc3,0xac igrave
0xc3,0xad iacute
0xc3,0xae icircumflex
0xc3,0xaf idiaeresis
0xc3,0xb0 eth
0xc3,0xb1 ntilde
0xc3,0xb2 ograve
0xc3,0xb3 oacute

(我在数据中看到这种情况的每种情况都会转换为相应的单个字符。)

其中许多显然是像'\ uxxxx'这样的单线形式的'别名',但我以双重方式接收它们。原始数据字节显示这实际上是从服务器传输的方式。

(一旦我以UTF-8收到它们,我没有理由将它们保留在内存中的本地表示中。)

我不知道该怎么称呼它,所以我很难找到很多关于它的信息,而且我无法就这个问题进行清楚的沟通。我想知道为什么它被使用,我在哪里可以找到将其转换为我的UIWebView可以正确呈现的内容的代码,但知道它的名称是我的问题。

我的问题是这个双重或配对形式叫做什么?

(如果它有用,我在Objective-C和CocoaTouch工作。)

2 个答案:

答案 0 :(得分:5)

\u00c3\u00bc
  

,它被渲染为两个单独的角色。

这明确表示两个字符ü。如果您希望看到ü,那么您所拥有的是在JSON生成器或输入其中的输入中进一步上游的错误处理。 有人将一系列字节解码为ISO-8859-1,他们应该使用UTF-8。

您可以通过读取JSON,编码为ISO-8859-1,然后解码为UTF-8来解决此问题。但这会破坏任何实际的正确输入,并且从示例中无法判断“错误”字符集是否实际上是ISO-8859-1或Windows代码页1252.可能是。

你真的需要解决问题的根源,而不是试图解决它。是您的服务器生成JSON吗?数据来自哪里?因为\u00c3\u00bc表示ü明确不正确。

答案 1 :(得分:4)

符号'\u00c3\u00bc'表示两个字符的序列“¼”,使用普通的JavaScript转义符号:在字符串文字中,'\uhhhh'代表字符(或者,技术上,Unicode代码单元)使用十六进制的Unicode编号hhhh。

这几乎是字符数据转换错误的标志。 当UTF-8编码数据被误解为ISO-8859-1编码(或其他一些8位编码)时,会经常发生此类错误。

可能真实的,未损坏的数据包含u和umlaut,ü,U + 00FC,其中UTF-8编码由字节c3和bc组成,请参阅 http://www.fileformat.info/info/unicode/char/fc/index.htm

您所指的文档http://cpansearch.perl.org/src/JANPAZ/Cstools-3.42/Cz/Cstocs/enc/utf8.enc似乎显示UTF-8编码的字符表示形式,以文本格式显示,方法是将字节显示为十六进制数。