【发布时间】:2011-02-03 10:39:50
【问题描述】:
在尝试将一些现有代码转换为支持 unicode 字符时,出现了这个问题。如果我尝试将 unicode 字符(在这种情况下使用欧元符号)传递给任何 *wprintf 函数,它将失败,但似乎只在 xcode 中。相同的代码在 Visual Studio 中运行良好,我什至可以让朋友在 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 */
【问题讨论】:
-
将源代码保留为 7 位 ascii,看看是否有帮助。例如在字符串中写入
"\u03b2"。 -
不高兴,仍然以同样的方式失败。我认为用 unicode 字符创建字符串没有任何问题,如果我只是用“A¥€”初始化字符串并读取它们都是正确的值,它只会在通过格式化打印函数时中断。跨度>