c++ Windows/Mac/iOS中的西班牙语字符

Spanish characters in C++ Windows/Mac/iOS

本文关键字:西班牙语 字符 iOS Windows Mac c++      更新时间:2023-10-16

我在iOS应用程序中显示西班牙语字符时遇到了一些问题。所涉及的代码都是c++,并在Windows应用程序和iOS应用程序之间共享。使用Visual Studio 2010在Windows中编译(字符集是多字节)。并在Mac上使用Xcode 4.2编译。

目前,代码正在使用char指针,我的第一个想法是我需要切换到wchar_t指针。然而,我注意到我想要输出的西班牙语字符在Windows中使用char指针显示得很好。这让我认为这些字符是多字节字符集的一部分,我不需要把所有的东西都更新到wchar_t,直到我准备好做一些日语,俄语,阿拉伯语等翻译。

不幸的是,虽然西班牙语字符在Windows应用程序中确实显示属性,但一旦进入Mac/iOS,它们就不能正确显示。在那里对wchar_t进行实验,我看到如果转换所有内容,它们将正确显示。但我不明白的是,希望有人能告诉我原因……为什么字符在Windows机器上完全有效,代码相同,而在Mac环境中显示为乱码(需要wchar_t代替)?

是visual studio做一些事情我的char指针在幕后,Mac没有做?换句话说,当我使用char指针而不是wchar_t时,微软环境是否对我的体系结构疏忽更加宽容?

看到我已经知道我的答案是从char指针转换到wchar_t指针,我真正的问题是"为什么Mac需要wchar_t,但在Windows中我可以使用相同字符的char ?"

谢谢。

Mac和Windows使用不同的代码页——它们都有西班牙字符可用,但它们显示为不同的字符值,因此相同的字节在每个平台上的显示方式不同。

在跨平台代码库中处理本地化的最佳方法是UTF8。UTF8在NSString -stringWithUTF8String:和Windows Unicode应用程序中通过调用MultiByteToWideChar与CP_UTF8来支持。事实上,由于它是Unicode,您甚至可以使用相同的技术来处理更复杂的语言,如中文。 如果可以的话,不要在跨平台代码中使用宽字符。这很复杂,因为wchar_t在OS x上实际上是32位宽的。实际上,由于这个原因,它也会浪费内存。 http://en.wikipedia.org/wiki/UTF-8

char, wchar_t, stringwstring均未附加任何编码。它们只是包含编译器决定将源文件解释为的任何二进制汤。您有三个变量可以关闭:

  1. 你的代码包含的内容(在实际文件中,在'"'字符之间,在二进制级别)
  2. 你的编译器认为这是什么。例如,您可能有一个UTF-8源文件,但编译器可以将wchar_t[]文字转换为适当的UCS-4。(我希望MSVC 2010可以做到这一点,但据我所知,它根本不支持UTF-8。)
  3. 你的渲染API所期望的。在Windows上,这通常是Little-Endian UTF-16(作为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