c++ - C++ Windows/Mac/iOS 中的西类牙字符

标签 c++ windows macos visual-studio-2010 xcode4.2

我在 iOS 应用程序中显示西类牙文字符时遇到一些问题。有问题的代码都是 C++,并且在 Windows 应用程序和 iOS 应用程序之间共享。使用 Visual Studio 2010 在 Windows 中编译(字符集为多字节)。并在 Mac 上使用 Xcode 4.2 编译。

目前,代码正在使用 char 指针,我的第一个想法是我需要切换到 wchar_t 指针。但是,我注意到我想要输出的西类牙文字符在 Windows 中仅使用字符指针就可以正常显示。这让我觉得这些字符是多字节字符集的一部分,在我准备好进行一些日语、俄语、阿拉伯语等翻译之前,我不需要费心将所有内容更新为 wchar_t .

不幸的是,虽然西类牙字符确实在 Windows 应用程序中显示属性,但一旦它们进入 Mac/iOS,它们就不会正确显示。在那里试验 wchar_t,我发现如果我将所有内容都转换过来,它们将正确显示。但我不明白的是,希望有人能启发我的原因......为什么这些字符在 Windows 机器上完全有效,相同的代码,并且在 Mac 环境中显示为乱码(需要 wchar_t 而不是)?

visual studio 是否在幕后对我的字符指针做了一些 Mac 没有做的事情?换句话说,当我使用 char 指针而不是 wchar_t 时,Microsoft 环境是否只是对我的架构监督更宽容?

既然我已经知道我的答案是从 char 指针转换为 wchar_t 指针,那么我真正的问题是“为什么 Mac 需要 wchar_t 但在 Windows 中我可以使用 char 来表示相同的字符?”

谢谢。

最佳答案

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

在跨平台代码库中处理本地化的最佳方式是 UTF8。 UTF8 在 NSString -stringWithUTF8String: 中得到本地支持,在 Windows Unicode 应用程序中通过使用 CP_UTF8 调用 MultiByteToWideChar。事实上,由于它是 Unicode,您甚至可以使用相同的技术来处理更复杂的语言,例如中文。

如果可以的话,不要在跨平台代码中使用宽字符。这变得很复杂,因为 wchar_t 在 OS X 上实际上是 32 位宽。事实上,由于这个原因,它也会浪费内存。

http://en.wikipedia.org/wiki/UTF-8

关于c++ - C++ Windows/Mac/iOS 中的西类牙字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390874/

相关文章:

xcode - OS X 从 shell 返回到 Xcode swift

objective-c - 如何创建监听 NSDistributedNotifcations 的代理/守护程序

c++ - Objective C 协议(protocol)引用作为 C++ 类中的实例变量

使用 MinGW-w64 和 Boost.Build 的 C++ 构建环境

javascript - HTML 文本输入 - 阻止 Windows 8 触摸键盘?

c++ - 从 X : The readable size is Y bytes, 读取无效数据但可能读取 Z 字节

c++ - Qt/OSX WebSocket 打开握手超时

c++ - 将即时任务添加到 `CFRunLoop` 的最简单方法?

c++ - 当字符包含表情符号时如何比较字符?

java - Mojave 上缺少 MacOS Java 控制面板