c++ Windows/Mac/iOS中的西班牙语字符
Spanish characters in C++ Windows/Mac/iOS
我在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-8char
, wchar_t
, string
或wstring
均未附加任何编码。它们只是包含编译器决定将源文件解释为的任何二进制汤。您有三个变量可以关闭:
- 你的代码包含的内容(在实际文件中,在'"'字符之间,在二进制级别)
- 你的编译器认为这是什么。例如,您可能有一个UTF-8源文件,但编译器可以将
wchar_t[]
文字转换为适当的UCS-4。(我希望MSVC 2010可以做到这一点,但据我所知,它根本不支持UTF-8。) - 你的渲染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
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 罗马数字到阿拉伯语 (vinculum) - 读取字符串中的字符
- 使用C++将越南语字符从ISO88591、UTF8、UTF16BE、UTF16LE和UTF16编码为十六进制,反之亦然
- C++ UTF-8 瑞典语字符读取为 ASCII
- C++ 中的波斯语字符 utf8
- 无法将 Unicode(希腊语)字符保存到文件中
- 如何在C++中显示越南语字符
- 错误 C2664:"发送":无法将参数 2 从"服务器问候语"转换为"常量字符 *"
- 在 Linux 上的 C 语言中,popen / system to "ps all > file" 将所有行截断为 80 个字符
- 从具有印地语字符的数组中生成随机元素
- C++西班牙语问号
- 带有重音符号 [í é] 的西班牙语字母显示为奇怪的符号
- c++ Windows/Mac/iOS中的西班牙语字符
- 如何在c++控制台应用程序中输出波兰语字符
- 在Rcpp中用(西班牙语)重音单词排序映射
- 将字符与西班牙语字符进行比较
- 如何读取西班牙语编码的文件并逐个字符存储