Цель C - проблема при преобразовании данных в NSString путем кодирования с использованием NSUTF8StringEncoding - PullRequest
0 голосов
/ 15 июня 2011

Я пытаюсь прочитать данные UTF-8, отправленные с сервера Java на iphone

            uint8_t buf[1024];

            unsigned int len = 0;

            len = [(NSInputStream *)stream read:buf maxLength:1024];

            if(len) {

, с помощью этого:

NSString *chrStr = [[NSString alloc] initWithBytes:(const void *)buf length:len encoding:NSUTF8StringEncoding];

, когда buf имеет длину <129, преобразованиеХорошо.но если длина> 129, chrStr возвращает ноль

Если я меняю кодировку с помощью NSASCIIStringEncoding:

NSString *chrStr = [[NSString alloc] initWithBytes:(const void *)buf length:len encoding:NSASCIIStringEncoding];

преобразование в порядке с длиной> 129, но символы UTF8 неверны: (

извините за мой английский.

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

-[NSString initWithBytes:length:encoding:NSUTF8StringEncoding] работает со строками длиннее 129 байт.

Ваша проблема в другом месте.

Изменить, чтобы ответить на комментарий:

Как я уже сказал, у вас проблема не от длины , а от какой-то другой проблемы. Как предположил @Bavarious, ваша строка может быть недействительной UTF-8.

Следующий код работает как положено:

const char* c_string = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
NSString *string = [[[NSString alloc] initWithBytes:c_string
                                             length:strlen(c_string)
                                           encoding:NSUTF8StringEncoding] autorelease];
assert([string length] == strlen(c_string)); // only valid for ASCII

Если вы все еще думаете - [NSString initWithBytes: length: encoding:] может работать не так, как ожидалось, пожалуйста, отправьте код вместе с рассматриваемой строкой.

1 голос
/ 15 июня 2011

Возможно, вы читаете частичную строку UTF8 в "buf".То есть, при следующем чтении из потока вы можете получить несколько завершающих байтов, потому что ваш кодированный в UTF-8 символ был разделен в середине.

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