gcc wstring_convert 中的错误?
Bug in gcc wstring_convert?
我使用 MinGW 8.1.0 64 位。此代码段:
#include <clocale>
#if __has_include(<codecvt>)
#include <codecvt>
#endif
#include <cstdlib>
#include <locale>
#include <string>
#include <wchar.h>
#include <iostream>
int main() {
auto utf8_decode = [](const std::string &str) -> std::wstring {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str);
};
std::string test = "=";
auto s = utf8_decode(test);
std::wcout << s << std::endl;
return 0;
}
在 Windows 上输出象形文字(或一些乱码),但在 Linux 上输出 =
(如预期)。
这是标准库中的错误还是我遗漏了什么?
看起来确实是这样a bug in MinGW libstdc++.dll; codecvt 错误地选择了大端,所以 =
(0x3d) 变成了 㴀
(0x3d00).
建议的解决方法 - 使用 codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>
手动强制小端
我使用 MinGW 8.1.0 64 位。此代码段:
#include <clocale>
#if __has_include(<codecvt>)
#include <codecvt>
#endif
#include <cstdlib>
#include <locale>
#include <string>
#include <wchar.h>
#include <iostream>
int main() {
auto utf8_decode = [](const std::string &str) -> std::wstring {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str);
};
std::string test = "=";
auto s = utf8_decode(test);
std::wcout << s << std::endl;
return 0;
}
在 Windows 上输出象形文字(或一些乱码),但在 Linux 上输出 =
(如预期)。
这是标准库中的错误还是我遗漏了什么?
看起来确实是这样a bug in MinGW libstdc++.dll; codecvt 错误地选择了大端,所以 =
(0x3d) 变成了 㴀
(0x3d00).
建议的解决方法 - 使用 codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>