2015-10-16 42 views
0

我想從二進制文件中解碼一些Unicode字符串。我知道他們被編碼爲UTF-16,他們有一個'big endian'BOM(0xFFFE)。但是當我試圖把它們變成一個字符串時,我最終得到了一堆中文字符。從字節數組創建NSString使用Swift語言生成錯誤的字符

var bytes:[UInt8] = [0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x0E, 0xFE] 
let text = NSString(bytes: &bytes, length: bytes.count, encoding:NSUTF16BigEndianStringEncoding) 

print(text) 

這打印的是中文字符和一個[?]而不是「ABC!︎」,這是我應該做的(我相信)。

我試過不同的編碼,但沒有任何工作正常。誰能幫忙?

+0

這些字節是{A,B,C,變異SELECTOR-15}在UTF-16LE。 –

回答

0

您提供的數據樣本編碼爲小尾數。

enter image description here

我不知道這是否是你的樣本數據與否。

+0

Doh!你太對了。現在我感到很蠢。 – user3743582

0

那麼,你的輸入可能有問題。

首先,BOM應作爲第一個序列放置在輸入中。其次,您提供的字節順序相反。

這個例子顯示了正確解析:

var bytes:[UInt8] = [0xFF, 0xFE, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00] 
var text = NSString(bytes: &bytes, length: bytes.count, encoding:NSUTF16LittleEndianStringEncoding)! 

print(text) // prints "ABC\n" 

bytes = [0xFE, 0xFF, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43] 
text = NSString(bytes: &bytes, length: bytes.count, encoding:NSUTF16BigEndianStringEncoding)! 

print(text) // "ABC\n" 
+0

當然你是對的。我愚蠢。 – user3743582