В Objective C есть ли способ преобразовать многобайтовый массив байтов Unicode в NSString, где он позволит выполнить преобразование, даже если данные массива являются частичным буфером (не на полной границе символов)?
Применение этого заключается в получении байтовых буферов в потоке, и вы хотите проанализировать строковую версию буфера данных (но есть еще данные, и данные вашего буфера не имеют полного многобайтового юникода).
Метод initWithData:encoding:
NSString не работает для этой цели, как показано здесь...
Тестовый код:
- (void)test {
char myArray[] = {'f', 'o', 'o', (char) 0xc3, (char) 0x97, 'b', 'a', 'r'};
size_t sizeOfMyArray = sizeof(myArray);
[self dump:myArray sizeOfMyArray:sizeOfMyArray];
[self dump:myArray sizeOfMyArray:sizeOfMyArray - 1];
[self dump:myArray sizeOfMyArray:sizeOfMyArray - 2];
[self dump:myArray sizeOfMyArray:sizeOfMyArray - 3];
[self dump:myArray sizeOfMyArray:sizeOfMyArray - 4];
[self dump:myArray sizeOfMyArray:sizeOfMyArray - 5];
}
- (void)dump:(char[])myArray sizeOfMyArray:(size_t)sourceLength {
NSString *string = [[NSString alloc] initWithData:[NSData dataWithBytes:myArray length:sourceLength] encoding:NSUTF8StringEncoding];
NSLog(@"sourceLength: %lu bytes, string.length: %i bytes, string :'%@'", sourceLength, string.length, string);
}
Вывод:
sourceLength: 8 bytes, string.length: 7 bytes, string :'foo×bar'
sourceLength: 7 bytes, string.length: 6 bytes, string :'foo×ba'
sourceLength: 6 bytes, string.length: 5 bytes, string :'foo×b'
sourceLength: 5 bytes, string.length: 4 bytes, string :'foo×'
sourceLength: 4 bytes, string.length: 0 bytes, string :'(null)'
sourceLength: 3 bytes, string.length: 3 bytes, string :'foo'
Как видно, преобразование байтового массива «sourceLength: 4 байта» завершается ошибкой и возвращает (null)
. Это связано с тем, что символ Юникода '×' UTF-8 (0xc3 0x97) включен лишь частично.
В идеале я мог бы использовать функцию, которая возвращала бы правильную строку NString и сообщала мне, сколько байтов «осталось».