2012-02-15 55 views
0

我正在Objective-C中開發一個iOS應用程序,該應用程序使用可以讀取磁條讀取器的​​。我正在使用他們的SDK。當我掃描一張卡時,我收到一個以標準ASCII編碼的NSData對象。如何編碼或轉換NSData對象

不幸的是,我在掃描丹麥醫療卡,這似乎在不同的ASCII碼進行編碼,可能ISO/IEC 646:1991 Norwegian/Danishhttp://www.ascii.ca/iso646.no.htm

例如,當人的醫療卡名稱中包含Ø,它顯示作爲\。這是因爲卡上使用的編碼對於Ø使用小數92(參見上面的鏈接),而標準ASCII小數92則使用char \。因此,如果名稱包含特殊字符(如Æ,Ø和Å),則無法讀取名稱。

我的問題是;我如何轉換/編碼NSData對象到正確的格式?

+0

如何顯示NSData對象? – iDifferent 2012-02-15 23:35:59

+0

目前都在使用NSLog的控制檯和UITextField中。 – dhrm 2012-02-15 23:39:08

回答

1

不幸的是,ISO 646並沒有提供每一個字符一個統一的定義。它表示7位ASCII字符,並且字符集中有一些範圍是使用特定於區域的變體定義的。有關更多信息,請參見the ISO 6464 Wikipedia page

因此,可能沒有具體的方法來處理這一般性,以便它可以在任何地區正常工作。我對卡片標準並不熟悉,但知道卡片數據中是否有特定的字節會告訴您要應用哪種變體會很有趣。換句話說,您是否可以閱讀一些信息,告訴您是否應用英語,德語,丹麥語或其他變體?

一旦你知道應用哪個變種,最好的辦法就是尋找支持將這些數據轉換爲ISO 8859-1的C庫。一旦獲得ISO-8859-1(或類似格式)數據,您可以使用kCFStringEncodingISOLatin1將其轉換爲NSString。

我不確定在iOS上是否有任何可用於ISO-8859-1轉換庫的ISO-646。我在這裏看到的最常見的C庫是libiconv GNU庫,但我認爲iOS上支持的情況並不存在特定的轉換。如果涉及到這一點,使用此man page上顯示的轉換表手動轉換字節應該不會太困難。如您所見,只有少量字符需要針對任何給定的變體進行轉換。

0

嘗試使用NSString -initWithBytes:長度:編碼:

+0

所以我應該將我的NSData對象轉換爲字節數組?我應該使用哪種編碼? – dhrm 2012-02-15 23:38:27

+0

一個更好的[[的NSString頁頭] initWithData:NSData的編碼:有下列之一: kCFStringEncodingMacRoman kCFStringEncodingWindowsLatin1 kCFStringEncodingISOLatin1 kCFStringEncodingNextStepLatin kCFStringEncodingASCII kCFStringEncodingUnicode kCFStringEncodingUTF8 kCFStringEncodingNonLossyASCII,不知道哪一個能幫助你。 – Allen 2012-02-16 00:15:22

0

試試這個:

[NSString stringWithData:data encoding:NSUTF8StringEncoding]

+0

我試過了相同的結果。在UTF8中,十進制92也是對退格進行評估。 – dhrm 2012-02-15 23:43:54