Кодирование потока текста из PDF в UCS-2 в Objective-C - PullRequest
0 голосов
/ 25 мая 2011

Я использую CGPDFStringGetBytePtr, чтобы получить const char * с именем str из CGPDFStringRef, извлеченного из потока PDF. Я хочу преобразовать str в UCS-2 представление (выражение типа ...\303...), используя iconv, но я не знаю, как кодировался str. Как я решу это? Или какова была вероятная кодировка (учитывая, что я транслирую PDF на Mac)? Возможно, мне не хватает дерева для деревьев.

* РЕДАКТИРОВАТЬ # 1.

CFStringRef aStringRef = CGPDFStringCopyTextString(aCGStringRef);
NSString * aString = (NSString *) aStringRef;

const char * bytes = [aString cStringUsingEncoding:NSUTF8StringEncoding];
bytes = [SKTextEncoding convertText:bytes
                         toEncoding:"UCS-2"
                       fromEncoding:"UTF-8"];

NSLog(@"%s", bytes);

* РЕДАКТИРОВАТЬ # 2. Строка и байты перед любым преобразованием, то есть результат:

              CGPDFStringRef aCGStringRef = NULL;
              CGPDFObjectGetValue(anObjectRef,
                                  kCGPDFObjectTypeString,
                                  &aCGStringRef);
              CFStringRef aStringRef =         
                    CGPDFStringCopyTextString(aCGStringRef);
              NSString * aString = (NSString *) aStringRef;
              const char * bytes = [aString   
                    cStringUsingEncoding:NSUTF8StringEncoding];
              NSLog(@"string: %@____bytes: %s", aString, bytes);

2011-05-25 16: 08: 00.966 Тестовая строка [1813: 207]: Æ ____ байт: √Ü

2011-05-25 16: 08: 00.967 Тестовая строка [1813: 207]: Ï ____ байт: √è

2011-05-25 16: 08: 00.967 Тестовая строка [1813: 207]: ® _ _байт: ¬Æ

2011-05-25 16: 08: 00.968 Тестовая строка [1813: 207]: fl ____ байт: Ô¨Ç

2011-05-25 16: 08: 00.968 Тестовая строка [1813: 207]: ³ _ _байт: ¬≥

2011-05-25 16: 08: 00.969 Тестовая строка [1813: 207]: ã ____ байт: √ £

2011-05-25 16: 08: 00.969 Тестовая строка [1813: 207]: • ____ байт: √Ø

2011-05-25 16: 08: 00.970 Тестовая строка [1813: 207]: ³ _ _байт: ¬≥

2011-05-25 16: 08: 00.970 Тестовая строка [1813: 207]: µ ____ байт: ¬µ

2011-05-25 16: 08: 00.971 Тестовая строка [1813: 207]: ____ байт: √Ç

2011-05-25 16: 08: 00.971 Тестовая строка [1813: 207]: Ü ____ байт: √ú

1 Ответ

1 голос
/ 25 мая 2011

Вместо использования CGPDFStringGetBytePtr() используйте CGPDFStringCopyTextString(). Последняя функция возвращает объект CFString (принадлежащий вызывающей стороне), который из-за бесплатного вызова может использоваться как объект NSString.

Будучи объектом NSString, вы можете отправить его -cStringUsingEncoding:, чтобы получить указатель const char * со строковым представлением в заданной кодировке, или -getCString:maxLength:encoding: для хранения строкового представления в заданной кодировке. Например, вы можете получить строку C в кодировке UTF-8 и затем использовать libiconv для преобразования ее в UCS-2:

CFPDFStringRef pdfString = …;
NSString *str = (NSString *)CGPDFStringCopyTextString(pdfString);
const char *bytes = [str cStringUsingEncoding:NSUTF8StringEncoding];
// use libiconv to convert the string in 'bytes' from UTF-8 to UCS-2
[str release];

В качестве альтернативы, вы можете использовать функции Core Foundation для строк. Я лично предпочитаю использовать их базовые классы Foundation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...