gpt4 book ai didi

c++ - swprintf 在 xcode 中使用 unicode 字符失败,但在 visual studio 中有效

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:47 25 4
gpt4 key购买 nike

在尝试转换一些现有代码以支持 unicode 字符时,突然出现了这个问题。如果我尝试将 unicode 字符(在本例中使用欧元符号)传递给任何 *wprintf 函数,它将失败,但似乎只在 xcode 中。相同的代码在 visual studio 中运行良好,我什至能够让 friend 在 linux 上使用 gcc 成功测试它。这是有问题的代码:

wchar_t _teststring[10] = L"";
int _iRetVal = swprintf(_teststring, 10, L"A¥€");

wprintf(L"return: %d\n", _iRetVal);

// print values stored in string to check if anything got corrupted
for (int i=0; i<wcslen(_teststring); ++i) {
wprintf(L"%d: (%d)\n", i, _teststring[i]);
}

在 xcode 中,对 swprintf 的调用将返回 -1,而在 visual studio 中,它将成功并继续为 3 个字符(65、165、8364)中的每一个打印出正确的值。

我在谷歌上搜索了很长时间并努力寻找解决方案,出现过多次的一个建议是使用如下调用:

setlocale(LC_CTYPE, "UTF-8");

我已尝试使用此函数的各种参数组合但没有成功,经过进一步调查,如果我尝试将语言环境设置为默认“C”以外的任何值,它似乎会返回 null。

我不知道我还能尝试什么来解决这个问题,而且它在其他编译器/平台上工作的事实只会让这一切变得更加令人沮丧。任何帮助将不胜感激!

编辑:只是想我会补充一点,当 swprintf 调用失败时,它会设置一个错误代码 (92),其定义为:

#define EILSEQ      92      /* Illegal byte sequence */

最佳答案

如果您从环境中获取语言环境,它应该可以工作:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void) {
setlocale(LC_ALL, "");
wchar_t _teststring[10] = L"";
int _iRetVal = swprintf(_teststring, 10, L"A¥€");

wprintf(L"return: %d\n", _iRetVal);

// print values stored in string to check if anything got corrupted
for (int i=0; i<wcslen(_teststring); ++i) {
wprintf(L"%d: (%d)\n", i, _teststring[i]);
}

}

在我的 OS X 10.6 上,这在 GCC 4.2.1 中按预期工作,但在使用 CLang 1.6 编译时,它会将 UTF-8 字节放入结果字符串中。

我也可以用 Xcode 编译它(使用标准的 C++ 控制台应用程序模板),但是因为 OS X 上的图形应用程序没有所需的语言环境变量,它在 Xcode 的控制台中不起作用。另一方面,它始终在终端应用程序中运行。

您还可以将语言环境设置为 en_US.UTF-8 (setlocale(LC_ALL, "en_US.UTF-8")),但这是不可移植的.根据您的目标,wsprintf 可能有更好的替代方案。

关于c++ - swprintf 在 xcode 中使用 unicode 字符失败,但在 visual studio 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4885094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com