2015-07-20 24 views
3

我有以下代碼時:wstring_converter異常解析的c串

#include <iostream> 
#include <string> 
#include <locale> 
#include <codecvt> 
using namespace std; 


int main() 
{ 
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; 

    const char val[] = "+3°C"; 
    wstring text = converter.from_bytes(val); 

    return 0; 
} 

的問題是,該方法converter.from_bytes拋出異常。爲什麼?我應該如何解析給定的字符串?

唯一的例外是std::range_error類型的與該消息

壞轉換

enter image description here

因爲如果刪除該字符的問題是關係到字符「°」,則轉換工作正常。

+0

什麼異常?你爲什麼不告訴我們? :( –

+0

[對我的作品(http://coliru.stacked-crooked.com/a/23923c288ed5f9f3)。 –

+0

@LightnessRacesinOrbit它不適合我的工作,請看到我的編輯。我使用Visual Studio 2013年 – Nick

回答

3

我的猜測是,該字符串字面"+3°C"不是UTF-8,因爲你的IDE使用不同的源代碼字符集編碼。

只能嵌入字符°直接進入源代碼,如果源文件本身是UTF-8編碼。如果它使用某個代表°的Windows代碼頁,則它可能會在字符串中嵌入一個或多個字節,這些字符不是有效的UTF-8字符,因此從UTF-8到UTF-16的轉換會失敗。

它在現場演示工作正常,如http://coliru.stacked-crooked.com/a/23923c288ed5f9f3,因爲在不同的操作系統,其中編譯器假定源文件默認情況下(這是GNU/Linux和與非理智的處理等平臺的標準使用UTF-8上運行ASCII文本)。

嘗試替換它一個UTF-8字面u8"+3\u2103"(使用用於DEGREES CELSIUS字符通用字符名)或u8"+3\u00B0C"(使用通用字符名稱爲DEGREE SIGN字符,然後大寫的C)。

這告訴編譯器,你需要一個字符串,它包含UTF-8表示的那些Unicode字符,而與源文件本身的編碼無關。