0

我的 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 的问题 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以获得正确答案。

4

2 回答 2

3

这一切都取决于各种程序中使用的编码,qtcreator,urxvt,gdb,...。

asciito转换utf-8没有意义,因为每个仅 ascii 的文件已经是 utf-8 编码的。前 127 个 utf-8 字符与 127 个 us-ascii 字符相同。

当我std::string s("Mäx");在 gdb 中查看时,我看到了

(gdb) ps
$1 = {static npos = <优化输出>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data字段>},_M_p = 0x602028“最大”}}

你的最后一个例子,

# 但索引 1 处的元素看起来像这样:“Mäx”

显示输出正在使用iso-8859-1,因为ä在 utf-8 中是两个字节的303 244八进制字符。您可以man iso-8859-1分别验证这一点。

因此,如果您在各种程序中看到不同的输出,这意味着它们使用不同的编码。

您有两个程序,urxvt 和 qtcreator。

根据此消息QtCreator and UTF-8,对于 qtcreator,您必须在项目的设置中设置编码。

对于 urxvt,环境似乎是有责任的。我已经设置LANG=de_DE.UTF-8了,它适用于 UTF-8 字符串。但是,如果我开始 urxvt

LANG=de_DE urxvt

它在输出或gdb 中Mäx显示UTF-8 字符串。Mäx"M\303\244x

您可以在启动 urxvt 时测试不同的行为

LANG=en_US.UTF-8 urxvt

或者

LANG=en_US urxvt

并比较各自的输出。

更新

您可以通过右键单击argv[1]->“更改显示格式”->“UTF-8 字符串”来更改纯 C 字符串的显示。

为了std::string显示,M=\x来自调试助手。我在“工具”->“选项”->“调试器”->“调试助手”下禁用了调试助手。然后您可以看到各个成员std::string并更改_M_p为显示 UTF-8 字符串。

于 2013-02-10T19:37:38.357 回答
0

只需使用 wchar_t** 作为 main 的第二个参数。

于 2013-02-11T03:43:10.213 回答