- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 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/
我们正在使用一个 std::wstring_convert> converter; 在我们的记录器中,它从遗留组件获取 UTF-16 字符串并将其转换为我们写入日志的 UTF-8。转换器在每次转换时都
我希望能够将从文件中读取的文本转换为多字节字符。我在 Windows 上有以下适用于我的 C++ 代码。当我尝试在 Linux 上编译代码时失败了。 #include .... std::wstri
我有 C++ 代码将包含 🜆( ALCHEMICAL SYMBOL FOR AQUA REGIA ) 的 string 转换为 u16string: #include #include #inc
我正在编写一些需要使用系统语言环境在字节字符串和宽字符串之间进行转换的代码。从文件中读取时,这非常容易做到。我可以使用 std::wifstream , 用 std::locale("") 灌输它,
这个问题在这里已经有了答案: Specification of source charset encoding in MSVC++, like gcc "-finput-charset=CharSe
我正在计划使用 C++Builder 10.1 (Clang 3.3) 的新 C++11 Win32/64 项目,并考虑在核心功能方面以最便携的方式实现它,所以我想使用 UTF-8 作为 std::s
我正在使用 std::wstring_convert 将 wstring 转换为多字节字符串,如下所示: // convert from wide char to multibyte char
在头文件 locale 中声明了两个方便的接口(interface):std::wstring_convert 和 std::wbuffer_convert。但是,没有使用示例。 有没有简明的例子说明
我正在从一个 utf-8 文本文件中获取文本,并按 block 执行以提高性能。 std::ifstream.read(myChunkBuff_str, myChunkBuff_str.length(
当您从 std::u16string 转到时,假设 std::u32string,std::wstring_convert 不起作用正如它所期望的那样 chars。那么如何使用 std::wstrin
C++11 的 std::wstring_convert效果很好 * 用于标准 UTF-8 UTF-16/UCS2/UCS4 转换。但是,当我尝试使用不是来自 的构面实例化 wstring_con
我是一名优秀的程序员,十分优秀!