Как кодировать или конвертировать объект NSData - PullRequest
0 голосов
/ 16 февраля 2012

Я разрабатываю приложение для iOS в Objective-C, которое использует кард-ридер UniMag , который может читать Magnetic Stripe Reader. Я использую их SDK. Когда я сканирую карту, я получаю объект NSData, который закодирован в стандартном ASCII.

К сожалению, я сканирую датскую медицинскую карту, которая, кажется, закодирована в другом формате ASCII, возможно ISO/IEC 646:1991 Norwegian/Danish: http://www.ascii.ca/iso646.no.htm

Например, если имя человека на медицинской карте содержит Ø, оно отображается как \. Это связано с тем, что в кодировке, используемой на карте, используется десятичное число 92 для Ø (см. Ссылку выше), тогда как стандартное десятичное число ASCII 92 оценивается как символ \. Из-за этого я не могу прочитать имена, если они содержат специальные символы, такие как Æ, Ø и Å.

Мой вопрос; Как я могу преобразовать / кодировать объект NSData в правильный формат?

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

К сожалению, ISO 646 не предоставляет единого определения для каждого символа. Он представляет 7-битные символы ASCII, и в наборе символов есть определенные диапазоны, которые определяются с использованием специфичных для региона вариантов. См. на странице Википедии ISO 6464 для получения дополнительной информации.

В результате, вероятно, нет конкретного способа обрабатывать это в общем, чтобы он работал правильно в любом регионе. Я не знаком со стандартами карт, но было бы интересно узнать, есть ли в данных карты конкретные байты, указывающие, какой вариант применить. Другими словами, есть ли какая-то информация, которую вы можете прочитать, которая скажет вам, применять ли английский, немецкий, датский или какой-либо другой вариант?

Как только вы знаете, какой вариант применить, вам лучше всего искать библиотеки C, которые поддерживают преобразование этих данных в ISO 8859-1. Получив данные в формате ISO-8859-1 (или аналогичном), вы можете преобразовать их в строку NSString с помощью kCFStringEncodingISOLatin1.

Я не уверен, есть ли какие-либо библиотеки преобразования ISO-646 в ISO-8859-1, доступные на iOS. Наиболее распространенные библиотеки C, которые я видел там для такого рода вещей, - это библиотека libiconv GNU, но я не думаю, что есть конкретное преобразование для вашего случая, поддерживаемое на iOS. Если дело доходит до этого, не должно быть слишком сложно вручную преобразовывать байты с помощью таблиц преобразования, показанных на этой странице man . Как видите, для любого конкретного варианта требуется преобразовать лишь небольшое количество символов.

0 голосов
/ 16 февраля 2012

Попробуйте это:

[NSString stringWithData:data encoding:NSUTF8StringEncoding]

0 голосов
/ 16 февраля 2012

попробуйте использовать NSString -initWithBytes: длина: кодировка:

...