gpt4 book ai didi

c++ - 德语变音符号作为命令行参数的错误编码

转载 作者:行者123 更新时间:2023-11-28 00:49:35 29 4
gpt4 key购买 nike

我的 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 的问题 problem with 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求正确答案。

最佳答案

这完全取决于各种程序中使用的编码,qtcreator、urxvt、gdb、....

ascii 转换为 utf-8 没有任何意义,因为每个纯 ascii 文件都已经是 utf-8 编码了。前 127 个 utf-8 字符与 127 个 us-ascii 字符相同。

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

(gdb) p s
$1 = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x602028 "Mäx"}}

你的最后一个例子,

# but the element at index 1 looks like this: "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

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

您可以在使用

启动 urxvt 时测试不同的行为
LANG=en_US.UTF-8 urxvt

LANG=en_US urxvt

并比较各自的输出。

更新:

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

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

关于c++ - 德语变音符号作为命令行参数的错误编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14801579/

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