Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的西班牙语字符+;Windows/Mac/iOS_C++_Windows_Macos_Visual Studio 2010_Xcode4.2 - Fatal编程技术网

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

C++ C+中的西班牙语字符+;Windows/Mac/iOS,c++,windows,macos,visual-studio-2010,xcode4.2,C++,Windows,Macos,Visual Studio 2010,Xcode4.2,我在iOS应用程序中显示西班牙语字符时遇到一些问题。代码中的所有代码都是C++,在Windows应用程序和iOS应用程序之间共享。使用Visual Studio 2010在Windows中编译(字符集为多字节)。并在Mac上使用Xcode 4.2编译 目前,代码正在使用char指针,我的第一个想法是需要切换到wchar\u t指针。然而,我注意到我想要输出的西班牙语字符在Windows中仅使用字符指针就可以很好地显示出来。这让我觉得这些字符是多字节字符集的一部分,在我准备好做一些日文、俄文、阿拉

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

目前,代码正在使用char指针,我的第一个想法是需要切换到wchar\u t指针。然而,我注意到我想要输出的西班牙语字符在Windows中仅使用字符指针就可以很好地显示出来。这让我觉得这些字符是多字节字符集的一部分,在我准备好做一些日文、俄文、阿拉伯文等翻译之前,我不需要费劲地将所有内容更新到wchar\t

不幸的是,虽然西班牙文字符在Windows应用程序中显示属性,但一旦进入Mac/iOS,它们就不会正确显示。在那里试验wchar__t时,我发现如果我转换所有内容,它们将正确显示。但我不明白的是,希望有人能告诉我原因。。。为什么这些字符在Windows计算机上完全有效,代码相同,在Mac环境中显示为乱码(需要wchar___t)

visual studio是否在幕后对我的字符指针做了Mac没有做的事情?换句话说,当我使用char指针而不是wchar\t时,微软环境是否更宽容我的架构疏忽

鉴于我已经知道我的答案是如何将字符指针转换为wchar\u t指针,那么我真正的问题是“为什么Mac需要wchar\u t,但在Windows中我可以将字符用于相同的字符?”


谢谢。

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

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

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


所有
char
wchar\u t
string
wstring
都没有附加任何编码。它们只包含编译器决定将源文件解释为的任何二进制文件。您有三个可以关闭的变量:

  • 代码所包含的内容(在实际文件中,“.”字符之间,二进制级别)
  • 您的编译器认为这是什么。例如,您可能有一个UTF-8源文件,但编译器可以将
    wchar\u t[]
    文本转换为正确的UCS-4。(我希望MSVC 2010可以这样做,但据我所知,它根本不支持UTF-8。)
  • 渲染API所期望的。在Windows上,这通常是小端UTF-16(作为
    LPWCHAR
    指针)。对于旧的
    LPCHAR
    API,它通常是“当前代码页”“,据我所知,这可能是任何事情。我认为iOS和Mac OS在内部使用UTF-16,但它们对接受和返回的内容非常明确
  • 如果这些类或编码之间存在不匹配,则没有任何类或编码可以帮助您

    在像Xcode或Eclipse这样的IDE中,您可以在其属性页中看到文件的编码。在Xcode 4中,这是最右边的窗格,如果它是隐藏的,则使用cmd+alt+0将其打开。如果字符在代码编辑器中看起来正确,则编码正确。第一步是确保Xcode和MSVC以相同的方式解释相同的源文件。然后,您需要在渲染之前计算出它们被转换到内存中的内容。然后,您需要确保两个呈现API都需要相同的字符集

    或者,只需将字符串移动到与源代码分开的文本文件中,并使用定义良好的编码。UTF-8在这方面很好,但是所有能够编码所有必要字符的东西都可以工作。然后仅转换字符串以进行渲染(如果需要)


    我刚刚看到了这个答案,它为后一种选择提供了更多的理由:

    我认为西班牙语除了使用符合ASCII的
    字符
    /
    字符外,没有使用任何特殊字符,因此Windows可能足够聪明,可以进行字符压缩。西班牙语还使用了锐重音(')您可以使用std::wstring而不是std::string来封装诸如char/wchar\t指针之类的C内容。删除了我的答案,因为它没有回答你的问题。