Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::wstring与平假名的QString转换_C++_Windows_Qt_Qstring - Fatal编程技术网

C++ std::wstring与平假名的QString转换

C++ std::wstring与平假名的QString转换,c++,windows,qt,qstring,C++,Windows,Qt,Qstring,我正在尝试将包含平假名的文本从wstring转换为QString,以便它可以用于标签的文本属性。然而,我的代码不起作用,我不知道为什么会这样 下面的转换方法显然告诉我我做错了什么: std::wstring myWString = L"Some Hiragana: あ い う え お"; ui->label->setText(QString::fromStdWString(myWString)); 输出:一些平假名 如果我直接将平假名放在字符串中,我可以在标签上打印平假名: ui-

我正在尝试将包含平假名的文本从wstring转换为QString,以便它可以用于标签的文本属性。然而,我的代码不起作用,我不知道为什么会这样

下面的转换方法显然告诉我我做错了什么:

std::wstring myWString = L"Some Hiragana: あ い う え お";
ui->label->setText(QString::fromStdWString(myWString));
输出:一些平假名

如果我直接将平假名放在字符串中,我可以在标签上打印平假名:

ui->label->setText("Some Hiragana: あ い う え お");
输出:一些平假名:あ い う え お


这意味着我可以通过简单地使用std::string而不是std::wstring来避免这个问题,但我想知道为什么会发生这种情况。

VS将文件解释为Windows-1252而不是UTF-8

例如,あ' 在UTF-8中是
E3 81 82
,但编译器在将每个字节转换为相应的UTF-16码点
E3 201A
之前,将其作为单个Windows-1252字符读取(
81
被VS忽略,因为它是Windows-1252中保留的,或者如果VS碰巧将其转换为相应的C1控制字符,则不会由qt打印)

直接版本之所以有效,是因为编译器不执行任何转换,并将字符串保留为
E3 81 82

要解决您的问题,您需要通知VS该文件是UTF-8,根据其他帖子的说法,一种方法是确保该文件具有UTF-8 BOM

解决此问题的唯一便携式方法是使用转义序列:

L"Some Hiragana: \u3042 \u3044 \u3046 \u3048 \u304A"

有一些奇怪的UTF-8 WORDOWS 1252的SunANGIN继续进行,源文件的编码是什么,你使用的是什么编译器?文件编码是UTF-8,编译器是微软Visual C++编译器12(x86)。你有没有尝试过“代码> QSt::FasWrCARARCH(MyWScultCyStReSo));< /C> >和<代码> MyScord.ToTF8]()?@Laszlo Papp我以前试过,结果也是一样。我想我的Qt不喜欢UTF-8。^^@user3582665:好的,你没有提到,所以只是重复检查。;@user657267谢谢你的帮助解释。现在一切都有意义了。这不是唯一的便携方式。OP也可以直接使用Qt,因为它是Qt的一种用途@LaszloPapp这是唯一一种可移植的方式,基本源字符集([lex.charset])之外的任何字符的表示都是实现定义的。我不明白,OP可以直接使用QString。事实上,他在问题中写道,这是可行的,这可能是应该在这里做的,而不是其他解决办法。好吧,如果由我来决定,我会这样做以避免痛苦。:)@拉兹洛·帕普:我希望这能奏效。QString myQString=“一些平假名:あ い う え お"; ui->label->setText(myQString);输出:一些平假名:?