我在iOS应用中显示西班牙语字符时遇到一些问题。有问题的代码都是C ++,并在Windows应用程序和iOS应用程序之间共享。使用Visual Studio 2010在Windows中编译(字符集为多字节)。并使用Mac上的Xcode 4.2进行编译。
目前,代码使用的是char指针,我首先想到的是我需要切换到wchar_t指针。但是,我注意到我想输出的西班牙语字符只在使用char指针的Windows中显示得很好。这让我觉得这些字符是多字节字符集的一部分,我不需要麻烦地将所有内容更新到wchar_t,直到我准备好做一些日语,俄语,阿拉伯语等翻译。
不幸的是,虽然西班牙语字符在Windows应用程序中显示属性,但一旦它们到达Mac / iOS,它们就无法显示。在那里试验wchar_t,我发现如果我把所有东西都转换成它们就会正常显示。但是我不明白,并希望有人可以告诉我原因...为什么这些角色在Windows机器上完全有效,相同的代码,以及在Mac环境中作为胡言乱语(需要wchar_t代替)的推迟?
视觉工作室是否在Mac幕后工作时对我的char指针做了些什么?换句话说,当我使用char指针而不是wchar_t时,Microsoft环境是否只是对我的架构疏忽更加宽容?
看到我已经知道我的答案是如何从char指针转换为wchar_t指针,我真正的问题是“为什么Mac需要wchar_t但在Windows中我可以使用char来表示相同的字符?”
感谢。
答案 0 :(得分:3)
Mac和Windows使用不同的代码页 - 它们都有西班牙语字符可用,但它们显示为不同的字符值,因此在每个平台上相同的字节将显示不同。
在跨平台代码库中处理本地化的最佳方法是UTF8。 UTS8本身支持NSString -stringWithUTF8String:并且在Windows Unicode应用程序中通过使用CP_UTF8调用MultiByteToWideChar。事实上,由于它是Unicode,你甚至可以使用相同的技术来处理更复杂的语言,如中文。
如果可以提供帮助,请不要在跨平台代码中使用宽字符。这很复杂,因为OS X上的wchar_t实际上是32位宽。事实上,由于这个原因,它也浪费了内存。
答案 1 :(得分:2)
char
,wchar_t
,string
或wstring
都没有附加任何编码。它们只包含编译器决定将源文件解释为的二进制汤。你有三个可能关闭的变量:
wchar_t[]
文字转换为适当的UCS-4。 (我希望MSVC 2010可以做到这一点,但据我所知,它根本不支持UTF-8。)LPWCHAR
指针)。对于旧的LPCHAR
API,它通常是“当前代码页”,据我所知,它可以是任何。我认为iOS和Mac OS在内部使用UTF-16,但他们非常明确地接受和返回它们。如果任何类或编码之间存在不匹配,则没有类或编码可以帮助您。
在像Xcode或Eclipse这样的IDE中,您可以在其属性表中看到文件的编码。在Xcode 4中,这是最右侧的窗格,如果隐藏了cmd + alt + 0,则将其显示出来。如果字符在代码编辑器中看起来正确,则编码是正确的。第一步是确保Xcode和MSVC以相同的方式解释相同的源文件。然后你需要在渲染之前计算它们被转入内存的内容。然后,您需要确保两个渲染API都期望完全相同的字符集。
或者,只需将字符串移动到与源代码分开的文本文件中,并使用明确定义的编码。 UTF-8非常适用于此,但一切都可以编码所有必要的字符。然后只翻译你的字符串以进行渲染(如果需要)。
我刚看到这个答案,为后一个选项提供了更多理由:https://stackoverflow.com/a/1866668/401925