1

我是我的 iOS 5.1 应用程序,我使用wchar_t用于字符串的 3rd 方库。这在内部工作正常,但我有时需要NSString为这样的字符串创建一个。我可以使用以下 API:

- (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:

请注意,我不关心这里的平台之间的数据交换(尽管有一天我可能不得不面对这个问题)。

谷歌搜索并没有太大帮助。

我的预感是这是编译器定义的,例如,当我编写时,我的编译器 (CLang) 使用什么编码:

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

当然,编写一个小示例程序并找出答案很容易,但我想要一个不依赖于我的编译器的具体实现的解决方案。

如果你相信我很困惑,那是因为我有点。

4

2 回答 2

4

这就是wchar_t无法推荐的原因,除非您需要直接使用 Windows API。

在 iOS 上,wchar_t是带有本机字节顺序的 UTF-32。这在技术上NSUTF32StringEncoding表示不同,后者表示带有 BOM 的字节顺序。

这是我上次回答这个问题时的一些复制面食(链接):

#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_t到, using 也可能会导致错误NSString,但这是极不可能的。

于 2012-05-23T22:51:18.027 回答
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 转换。是的,这是一个额外的箍。跳过它。

于 2012-05-24T00:36:25.397 回答