English 中文(简体)
iOS的内涵是什么?
原标题:What s the endianness of iOS wchar_t?

Im my iOS 5.1 应用程序, 我使用一个使用 < code> wchar_t 字符串的第三方库。 这在内部运作良好, 但我有时需要为此字符串创建一个 < code> NSString 。 我可以使用以下 API :

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

但我应该使用什么编码? 由于iOS 中的 wchar_t 是32位元, 候选编码是:

NSUTF32StringEncoding
NSUTF32BigEndianStringEncoding
NSUTF32LittleEndianStringEncoding

我应使用哪个字节顺序? 我应使用与 < code> loong NSHostByteOrder () 相应的编码字节顺序吗?

顺便说一句,哪个字节顺序代表了 NSUTF32StringEncoding ? 它是否要检查字节并推断字节顺序? 当用 getBytes转换 NSString :maxLength: maxLength: usedLength: encoding: options: range: remainingRange: 时,它将产生什么效果?

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

到处乱逛也帮不上什么忙

我的直觉是,这是编译者定义的,例如,当我写作时,我的编译者(CLang)使用什么编码:

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

当然,写一个小样本程序并找出答案很容易, 但我喜欢一个不依赖具体实施我编译器的解决方案。

如果你认为我搞糊涂 那是因为我有点糊涂

最佳回答

这就是为什么 wchar_t 无法推荐的原因,除非您需要直接与 Windows API 合作。

在 iOS 上, < code> wchhar_t 是 UTF-32 的本地字节顺序。 这是 < em> technically 和 < code> 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_t 转换为 NSString , 而不一定是其他方式。 它会在前端插入 BOM( 无法保存), 甚至可能以错误的语义提供数据 。

使用 NSUTF32StringEncoding 也可能造成错误,甚至从wchar_t NSString,但极不可能。

问题回答

正如已经指出的,假设Wchar_t* 字符串编码为UTF-32是不安全的。

如果您对此非常关注并希望它尽可能稳健, 请使用 wcstombs_l () 将其中的 wchar_ t* 字符串转换为 UTF-8 编码字符* 字符串。 指定有新本地 () 的“ UTF-8 ” 区域 。 这将可靠地将 wchar_ t* 字符串转换成一个 UTF-8 编码字符* 字符串。 您可以用 mbstowcs_l () 转换回 。

一旦您有了 UTF-8 编码字符*, 您就应该全部设置为 NSUTF8 String 编码转换。 是的, 它是一个额外的圈子, 跳过它 。





相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...