我的 QTCreator 运行 x64 ArchLinux 时遇到了严重问题。包含德语变音符号的命令行参数无效。我想将它们转换为 std::string,这应该是可能的,至少这是我能读到的全部内容。
std::string arg(argv[1]);
// do something with arg
如果我使用调试器查看变量,它会显示一个有点转义的字符串。例如,ä 变成“=\”。但是,如果我
std::cout << arg << std::endl;
该变量在我的控制台(urxvt)上完全正常。
我检查了 QtCreator 的编辑器设置(我以前从未接触过),它说,它使用 UTF-8。在将一些变音符号添加到注释中并执行后,我将源文件转换为 UTF-8
% iconv -f ascii -t utf-8 main.cpp > _main.cpp
% mv _main.cpp main.cpp
# qtcreator recognized the change and ask me to reload the file, what I did
% file -bi main.cpp
# then results text/x-c; charset=utf-8, was text/x-c; charset=us-ascii before
没有任何效果。我什至无法定义包含变音符号的 std::string:
std::string s("Mäx");
// the GDB debugger show 's' as: M=\x
然后我从我的 .pro 文件中定义了 UNICODE
DEFINES += UNICODE
# also without success
为了更加神秘化,以下内容具有不同的效果:
std::vector< std::string > list(argv, argv + argc);
# the debugger shows 2 elements (which is correct)
# but the element at index 1 looks like this: "Mäx"
我完全无助。也许有人可以帮忙。谢谢
@奥拉夫:
// lacks sanity checks but good enough for testing
std::wstring Encoding::char2Wide(const char *chars) {
setlocale(LC_ALL, "");
// get the length of the string to convert
int len = mbstowcs(NULL, chars, 0) + 1;
wchar_t* result = new wchar_t[len];
len = mbstowcs(result, chars, len);
std::wstring s(result);
return s;
}
2013 年 2 月 11 日
为了澄清一点,这张图片显示了 std::string 的问题
控制台上的输出不是问题。完全没问题。这是我的语言环境设置
% locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
哈哈:
if ( s == "Mäx" ) std::cout << "Yeahhh" << endl;
-> Yeahhh (what the fxxx!)
也许这只是一个 qtcreator 问题。我今天用 Visual Studio 尝试了这个简单的例子,一切都按预期进行。而且,它也可以像我期望的那样在 Linux 上使用 Eclipse CDT。GDB 显示正确的值。我想,我会提交一个错误。
更新
在这里查看https://stackoverflow.com/a/14801772/76591以获得正确答案。