2015-07-20 2 views
3

У меня есть следующий код:wstring_converter исключение при анализе с-строку

#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, потому что это работает на другой ОС, где компилятор предполагает, что исходные файлы используют UTF-8 по умолчанию (что является стандартом для GNU/Linux и других платформ с более удобной обработкой не- ASCII-текст).

Попробуйте заменить его с UTF-8 буквальным u8"+3\u2103" (с помощью универсального символьного имени для DEGREES CELSIUS символа) или u8"+3\u00B0C" (с помощью универсального имени символа для DEGREE SIGN характера, а затем капитал C).

Это говорит компилятору, что вы хотите, чтобы строка, содержащая UTF-8, представляла именно эти символы Unicode, независимо от кодировки самого исходного файла.