2017-09-17 343 views
0

我有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= 
+0

你真的打算,看起来像一个空心方角色转换?因为我看到一个空心的方形角色。 –

+0

@ n.m。对不起,我添加了关于此字符的详细信息 – diraria

+0

在源代码中使用非基字符集字符很脆弱。没有人知道你的编辑或编译器会做什么。指定扩展字符的便携方式是通过其通用字符名称。 –

回答

4

这不是你的转换器应该是什么样子?

std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;

+0

这解决了我的问题。非常感谢! – diraria

相关问题