在Objective C中,有一種將多字節Unicode字節數組轉換爲NSString的方法,即使數組數據是部分緩衝區(不在完整的字符邊界上)?使用部分緩衝區將多字節Unicode字節數組轉換爲NSString
這是當在流中接收字節緩衝區,並且你想要解析數據緩衝區的字符串版本(但是會有更多數據來的時候,並且你的緩衝區數據沒有完整的多字節Unicode)的。
的NSString的initWithData:encoding:
方法不適用於此目的,如下所示...
測試代碼:
- (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 unicode'×'字符(0xc3 0x97)只是部分包含在內。
理想情況下,會有一個函數,我可以使用它會返回正確的NString,並告訴我有多少字節「剩餘」。
謝謝...給你一個給予好評您的想法。你說的是正確的,但是在某些情況下,性能非常糟糕。在這種情況下,性能至關重要,因爲我可能正在處理千兆字節的數據。 – TJez 2014-08-28 16:12:22