iOS UTF7 кодирование / декодирование
У меня проблема с декодированием UTF7. Я смог выделить проблему, создав следующий пример кода:
NSStringEncoding stringEncoding = myFunctionForTranslateCodepageToEncoding(codePage);
// see the end of the string, it's important
const char * testBuffer ="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+ADw-";
NSString * testString = [[NSString alloc] initWithBytes:testBuffer length:strlen(testBuffer) encoding:stringEncoding];
Куда:
strlen (testBuffer) составляет 508,
"codePage" - 65000,
'stringEncoding' - 2214592768 (вероятно, UTF-7, как и ожидалось, но я не могу найти четкого подтверждения...).
"+ADw-" - это последовательность UTF7 для "<".
В этом примере testString всегда равен nil, поэтому преобразование завершается неудачно. Но вот странные вещи:
- Когда я удаляю только один "а" из testBuffer, преобразование работает, testString создается правильно. Когда я добавляю один или несколько "а", это не работает.
- Когда я "повреждаю" кодированный символ utf7 в конце (единственный в этом примере, "+ADw-"), он работает нормально. Я могу изменить его на ".ADw-" или "+ ADw". и буфер конвертируется правильно. Конечно, "поврежденный" символ не декодируется, он просто написан буквально, но преобразование работает. Он производит "... aaaaa.ADw-" в NSString. Я также могу сократить буфер на 1, поэтому у меня будет "…aaaaa+ADw", и он также будет правильно преобразован (так как символ UTF7 является неполным).
- Когда я добавляю любой символ ASCII в конец буфера, после символа UTF7, он работает. То есть "... aaaaa+Adw-a" преобразуется в строку NSString "... aaa>a".
- Когда буфер содержит больше символов UTF7, длина, когда он начинает терпеть неудачу, изменяется. Так что это не всегда 508 или более символов.
- Я могу использовать любой другой символ UTF7 в конце. Это не важно
Я также пытался заменить initWithBytes: метод с initWithCString. Я не проверял все возможные случаи, но во всех протестированных он ведет себя так же, как initWithBytes:. Я провел свои тесты на iOS 6.0.
У вас есть идеи, как правильно обращаться со строками в кодировке UTF7?