如何编码或转换NSData对象

时间:2012-02-15 23:31:31

标签: objective-c ascii nsdata

我正在使用Objective-C开发iOS应用程序,该应用程序正在使用可以读取磁条读取器的UniMag card reader。我正在使用他们的SDK。当我扫描卡片时,我收到一个NSData对象,该对象以标准ASCII编码。

不幸的是,我正在扫描一张似乎用不同ASCII码编码的丹麦医疗卡,可能ISO/IEC 646:1991 Norwegian/Danishhttp://www.ascii.ca/iso646.no.htm

例如,当医疗卡上的人员姓名包含Ø时,它显示为\。这是因为卡上使用的编码使用十进制92表示Ø(参见上面的链接),而标准ASCII十进制表92计算为char \。因此,如果名称包含Æ,Ø和Å等特殊字符,我就无法读取名称。

我的问题是;如何将NSData对象转换/编码为正确的格式?

3 个答案:

答案 0 :(得分:1)

不幸的是,ISO 646没有为每个字符提供单一定义。它表示7位ASCII字符,并且字符集中存在使用区域特定变体定义的某些范围。有关详细信息,请参阅the ISO 6464 Wikipedia page

因此,可能没有特定的方法来处理这种情况,以便它可以在任何地区正常工作。我不熟悉卡标准,但知道卡的数据中是否有特定字节可以告诉您应用哪种变体会很有趣。换句话说,您是否可以阅读一些信息,告诉您是否应用英语,德语,丹麦语或其他变体?

一旦您知道要应用哪种变体,您最好的选择可能是寻找支持将此数据转换为ISO 8859-1的C库。获得ISO-8859-1(或类似)格式的数据后,可以使用kCFStringEncodingISOLatin1将其转换为NSString。

我不确定iOS上是否有ISO-646到ISO-8859-1转换库。我在这里看到的最常见的C库是libiconv GNU库,但我不认为在iOS上支持你的案例的特定转换。如果归结为它,使用此man page上显示的转换表手动转换字节应该不会太难。如您所见,对于任何给定的变体,只需要转换少量字符。

答案 1 :(得分:0)

尝试使用NSString -initWithBytes:length:encoding:

答案 2 :(得分:0)

试试这个:

[NSString stringWithData:data encoding:NSUTF8StringEncoding]