2017-09-17 346 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

相關問題