2012-05-23 48 views
1

我的iOS 5.1應用程序,我使用第三方庫,它使用wchar_t字符串。這在內部工作正常,但我有時需要爲這樣的字符串創建一個NSString。我可以使用以下API:什麼是iOS wchar_t的排序?

- (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding 

但是我應該使用什麼編碼?由於wchar_t在iOS的是32位,候選編碼是:

NSUTF32StringEncoding 
NSUTF32BigEndianStringEncoding 
NSUTF32LittleEndianStringEncoding 

我應該哪個字節順序使用?我是否應該使用對應於long NSHostByteOrder()的結果的編碼字節順序?

順便說一下,哪個字節順序是NSUTF32StringEncoding代表的?是否要檢查字節並推斷字節順序?當將 NSString轉換爲getBytes:maxLength:usedLength:encoding:options:range:remainingRange:時,它會產生什麼?

請注意,我不關心這裏的平臺之間的數據交換(儘管我可能有一天也要面對這個問題)。

谷歌搜索沒有什麼幫助。

我的預感是這是編譯器定義的,例如,什麼編碼使用我的編譯器(鐺),當我寫:

wchar_t *s = L"string with non ascii unicode characters such as éèüçß"; 

當然它很容易寫的一個小樣本程序,並找到答案,但我想,不依賴於一個解決方案具體實現我的編譯器。

如果您認爲我很困惑,那是因爲我有點。

+0

你正在推翻它。該庫將被編譯爲使用C編譯器的端點。對於大多數情況,NSUTF32StringEncoding應該沒問題。如果您要導出到非iOS主機,則遊戲會發生變化。 – starbolin

+0

在這種情況下,您需要添加一個選項來導出文件。您的導出文件格式應該是big-endian以與網絡字節順序兼容。 – starbolin

+0

@starbolin:'NSUTF32StringEncoding'有問題,它會在'NSString' - >'wchar_t'方向中引發問題。 –

回答

4

這就是爲什麼wchar_t不可能推薦,除非您需要直接使用Windows API。

在iOS上,wchar_t是具有本機字節順序的UTF-32。技術上這是NSUTF32StringEncoding不一樣,它表示具有BOM的字節順序。

下面是我最後一次回答了這個問題(link)一些副本麪食:

#include <machine/endian.h> 
#if BYTE_ORDER == BIG_ENDIAN 
#define WCHAR_ENCODING NSUTF32BigEndianStringEncoding 
#elif BYTE_ORDER == LITTLE_ENDIAN 
#define WCHAR_ENCODING NSUTF32LittleEndianStringEncoding 
#endif 

使用NSUTF32StringEncoding的問題是,它只會轉換wchar_tNSString工作,但不一定是其他方式。它會在前面貼上BOM(不合要求),甚至可能會給你錯誤的數據。

也可以在使用NSUTF32StringEncoding會導致甚至打算從wchar_tNSString錯誤,但這是極不可能的。

+0

謝謝,這很有道理 –

0

正如已經指出的,假設wchar_t *字符串是UTF-32編碼是不安全的。

如果您非常關心此問題,並希望它儘可能健壯,請使用wcstombs_l()將wchar_t *字符串轉換爲UTF-8編碼的char *字符串。用newlocale()指定「UTF-8」語言環境。這將可靠地將wchar_t *字符串轉換爲UTF-8編碼的char *字符串。您可以使用mbstowcs_l()進行轉換。

一旦你有一個UTF-8編碼的char *,你應該全部設置爲使用NSUTF8StringEncoding進行NSString轉換。是的,這是一個額外的箍。只需跳過它。

+0

這是不安全的。但是,它在iOS上是安全的。 –

+0

此外,爲什麼假定wchar_t *字符串是UTF-32編碼並不安全,因爲它是32位的?這是由於UCS-4和UTF-32之間的細微差別嗎?還是有什麼我失蹤? –

+0

此外,如果「假設」不安全,「wcstombs_l」如何在沒有「假設」的情況下執行?它會檢查文本尋找一個BOM或什麼? –