wstring_converter 解析 C 字符串时出现异常

wstring_converter exception when parsing a c-string

我有以下代码:

#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 类型,消息

bad conversion

问题与字符“°”有关,因为如果我删除此字符,转换工作正常。

我的猜测是字符串文字 "+3°C" 不是 UTF-8 编码的,因为您的 IDE 使用的是不同的源字符集。

如果源文件本身是 UTF-8 编码,您只能将字符 ° 直接嵌入到源代码中。如果它使用一些 Windows 代码页来表示 ° 不同,那么它可能将一个或多个字节嵌入到字符串中,这些字节不是有效的 UTF-8 字符,因此从 UTF-8 到 UTF-16 的转换失败.

它在 http://coliru.stacked-crooked.com/a/23923c288ed5f9f3 等现场演示中运行良好,因为它在不同的 OS 上运行,其中编译器假定源文件默认使用 UTF-8(这是 [=27 的标准) =] 和其他处理非 ASCII 文本的平台)。

尝试将其替换为 UTF-8 文字 u8"+3\u2103"(使用 DEGREES CELSIUS character) or u8"+3\u00B0C" (using the universal character name for the DEGREE SIGN 字符的通用字符名称,然后使用大写字母 C)。

这会告诉编译器您需要一个包含这些 Unicode 字符的 UTF-8 表示形式的字符串,而与源文件本身的编码无关。