【问题标题】:How to encode or convert a NSData object如何编码或转换 NSData 对象
【发布时间】:2012-02-15 23:31:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如何显示 NSData 对象?
  • 目前在控制台中使用 NSLog 和 UITextField。

标签: objective-c ascii nsdata


【解决方案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 上显示的转换表手动转换字节应该不会太难。如您所见,对于任何给定的变体,只有少量字符需要转换。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以我应该将我的 NSData 对象转换为字节数组?我应该使用哪种编码?
    • 一个更好的 [[NSString alloc] initWithData:nsdata 编码:使用以下之一:kCFStringEncodingMacRoman kCFStringEncodingWindowsLatin1 kCFStringEncodingISOLatin1 kCFStringEncodingNextStepLatin kCFStringEncodingASCII kCFStringEncodingUnicode kCFStringEncodingUTF8 kCFStringEncodingNonLossyASCII,不确定哪一个可以帮助你。
    【解决方案3】:

    试试这个:

    [NSString stringWithData:data encoding:NSUTF8StringEncoding]

    【讨论】:

    • 我尝试过同样的结果。在 UTF8 中,十进制 92 也计算为退格。
    猜你喜欢
    • 2011-03-11
    • 2017-05-12
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多