NSData转NSString – 如何处理不合法编码问题

在做iOS开发中一个很常见的应用场景就是从服务器接收一段数据然后把它显示出来。但是有时候服务器在数据处理时,比如拼接之类的操作,会出一些问题,造成传过来的数据并不符合指定的编码。(我碰到过的一种情况是,一段宣称用GB18030编码的文字中突然出现了几个用UTF8编码的词语)。浏览器在处理这个问题时,一般就会出现乱码,常用的编程语言在处理这个问题时,也是以乱码显示,而ObjC的NSString则直接返回了一个nil。这一直让我比较头疼,在旧版股吧的开发中曾经碰到因为接口返回的数据里面有一个字节是错的,导致整个接口返回的数据不能用了,当时在国内几个网站上问了别人,得到的都是一些不靠谱的回答。

今天同事又遇到了这个问题,不过他找到了如何让UTF8编码的里面混有错误字节的数据,以容错的方式显示出来而不是nil(见这个Gist),其实原理很简单,一个一个字节读过来,参照UTF8编码的说明,判断是不是合法字节,如果不是,用“?”来代替。根据这段代码,我改了一个用于GB18030编码的混有不合法字节的数据的容错转换。

Gist地址

No Comments

Post a Comment