【问题标题】:wstring_converter exception when parsing a c-string [duplicate]解析c字符串时出现wstring_converter异常[重复]
【发布时间】:2015-10-09 09:40:56
【问题描述】:

我有以下代码:

#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,带有消息

错误的转换

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

【问题讨论】:

  • 什么异常?你为什么不告诉我们? :(
  • @LightnessRacesinOrbit 它对我不起作用,请查看我的编辑。我正在使用 Visual Studio 2013。
  • 好多了;现在只需将您的编译环境的详细信息添加到问题中即可。 :)
  • 源文件中有非 ASCII 字符。这是非标准的。您受编译器供应商的摆布。如果您使用的是 MSVC,您最好使用what MS is telling you to

标签: c++ c++11 exception wstring


【解决方案1】:

我的猜测是字符串文字 "+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 字符的字符串,与源文件本身的编码无关。

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多