c++ - 如何让 wstring_convert::to_bytes 抛出 range_error 异常?

标签 c++ unit-testing unicode std visual-studio-2015

我正在使用 std::wstring_convert 将 wstring 转换为多字节字符串,如下所示:

    // convert from wide char to multibyte char
    try
    {
        return std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(wideMessage);
    }

    // thrown by std::wstring_convert.to_bytes() for bad conversions
    catch (std::range_error& exception)
    {
        // do something...
    }

为了对我评论为 do something... 的 block 进行单元测试,我希望传递一个将引发 std::range_error 异常的 wstring。

但是,我一直无法制定这样一个会导致此类转换失败的 wstring。 wstring 将使用 UTF16,我一直在阅读有关高代理和低代理的信息。例如,D800 后跟“b”的 UTF16 字符应该是无效的。 std::wstring(L"\xd800b"); 可能无法基于相同的理由进行编译。如果我创建如下所示的 wstring,它不会在转换时抛出异常:

std::wstring wideMessage(L" b");
wideMessage[0] = L'\xd800';

// doesn't throw
std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(wideMessage);

是否有合适的 wstring 可用于在转换期间抛出异常?

我已经尝试了来自 this link 的 5.1、5.2 和 5.3 .我正在使用 Visual Studio 2015。

最佳答案

Microsoft 的 std::codecvt_utf8 实现似乎成功地将任何 UTF-16 代码单元转换为 UTF-8——包括代理项对。这是一个错误,因为代理不可编码。 libc++ (LLVM) 和 libstdc++ (GCC) 都会正确抛出 std::range_error 并且无法转换未配对的代理。

查看他们的代码,似乎它抛出的唯一方法是字符大于 facet 的 Maxcode 模板参数。例如:

std::wstring_convert<std::codecvt_utf8<wchar_t, 0x1>>

关于c++ - 如何让 wstring_convert::to_bytes 抛出 range_error 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32182610/

相关文章:

c++ - 调整大小时在窗口中绘图留下未绘制的边框

java - 如何使用 JUnit 4 对 servlet 进行单元测试?

javascript - 使用 Jest 对 Electron-React 应用程序进行单元测试,TypeError : Cannot match against 'undefined' or 'null'

ASP.NET:将 XmlDocument 保存到 Response.OutputStream 会遵守编码吗?

java - 程序如何读取unicode?

c++ - 带有 boost::shared_ptr 的 static_cast?

c++ - 三元组的稀疏矩阵

python - python 包和测试的问题

java - 如何检测 Java 字符串中的 unicode 字符?

c++ - 不使用 sqrt 函数求平方根?