为什么wstring_convert抛出range_error
Why is wstring_convert throwing a range_error?
我正在编写一些代码,需要使用系统区域设置在字节字符串和宽字符串之间进行转换。当从文件中读取时,这是非常容易做到的。我可以先用std::wifstream
,再用std::locale("")
,然后只用std::getline
。
根据cppreference的codecvt页面,wifstream
只是使用codecvt<wchar_t, char, mbstate_t>
,所以我认为我可以通过使用std::string
和std::wstring
之间转换:
// utility wrapper to adapt locale-bound facets for wstring/wbuffer
convert
template<class Facet>
struct deletable_facet : Facet
{
template<class ...Args>
deletable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}
~deletable_facet() {}
};
std::locale::global(std::locale(""));
std::wstring_convert<
deletable_facet<std::codecvt<wchar_t, char, std::mbstate_t>>> wconv;
std::wstring wstr = wconv.from_bytes(data);
然而,当我试图运行这个,我得到一个range_error
从wstring_convert
抛出。我做了一些谷歌搜索,显然这是当wstring_convert
无法转换字符串时发生的情况。
然而,这些字符串显然完全能够使用wfstream
进行转换,这应该使用与wstring_convert
相同的codecvt
。那么为什么wifstream
起作用,而wstring_convert
不起作用呢?
是否有一种方法可以让我在string
s和wstring
s之间转换使用系统的区域设置?
这里是我的问题的完整示例,改编自codecvt页面,输出是:
sizeof(char32_t) = 4
sizeof(wchar_t) = 4
The UTF-8 file contains the following UCS4 code points:
U+007a
U+00df
U+6c34
U+1f34c
The UTF-8 string contains the following UCS4 code points:
U+007a
U+00df
U+6c34
U+1f34c
terminate called after throwing an instance of 'std::range_error'
what(): wstring_convert
Aborted (core dumped)
您的wifstream
和wstring_convert
使用不同的facet
wifstream
正在使用语言环境相关的转换facet;通过std::use_facet
std::locale("")
中取出。 wstring_convert
被赋予了一个独立于语言环境的独立编码面,而你的实现提供的编码面显然不会将UTF-8转换成任何合适的内容;试着直接调用它,看看它是怎么做的。
获取依赖于语言环境的facet的一种简单方法是按名称请求它,如std:: codecvt_byname
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 从不同目录执行时"symbol lookup error:",否则从构建目录执行时按预期工作
- 对象声明中的模板"error: expected expression"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- OpenCV 3.4.1 error readNetFromTensorflow 无法在 cv::d nn::ReadProtoFromBinaryFile 中打开 .pb
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 为什么我会"error: expected expression"?
- CMake Error at modules/videoio/cmake/detect_ffmpeg.cmake:16
- 我正在"string subscript out of range error".我不知道为什么
- 每次调试此代码时,我都会得到"subscript out of range error"。有人可以帮我查明一个或多个错误吗?