我有C++代码转换string
包含(ALCHEMICAL SYMBOL FOR AQUA REGIA)至
u16string
:为什么`wstring_convert`引发range_error?
#include <string>
#include <codecvt>
#include <locale>
using namespace std;
int main() {
setlocale(LC_ALL, "ru_RU.UTF-8");
string s = "";
wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
u16string s16 = converter.from_bytes(s);
return 0;
}
注意,我不使用wstring
或任何istream
。
这给了我std::range_error
:
terminate called after throwing an instance of 'std::range_error'
what(): wstring_convert::from_bytes
但on ideone this code runs without error。
与-std=c++14
编译时,我收到g ++ 7.2.0和clang 4.0.1的错误。
为什么ideone没有错误,为什么我收到此错误?
我Arch Linux的13年4月12日和locale
命令给我:
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
...
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
你真的打算,看起来像一个空心方角色转换?因为我看到一个空心的方形角色。 –
@ n.m。对不起,我添加了关于此字符的详细信息 – diraria
在源代码中使用非基字符集字符很脆弱。没有人知道你的编辑或编译器会做什么。指定扩展字符的便携方式是通过其通用字符名称。 –