- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据 cppref , 有一个 operator <<
std::basic_ostream<wchar_t>
过载接受 const char*
.似乎转换操作只是加宽了每个 char
进入 wchar_t
.也就是说,转换(插入)的宽字符数等于窄字符数。那么问题来了。窄字符串可能正在编码国际字符,比如使用 GB2312 的汉字.进一步假设sizeof(wchar_t)
是2
并使用 UTF16 编码。那么这种天真的字符转换方法应该如何工作?
最佳答案
我刚刚检查了 Visual Studio 2015,你是对的。 char
仅扩展为 wchar_t
,没有任何转换。在我看来,您必须自己将窄字符串转换为宽字符串。有几种方法可以做到这一点,其中一些已经被建议。
在这里,我建议您可以使用纯 C++ 工具来完成它,假设您的 C++ 编译器和标准库足够完整(Visual Studio 或 Linux 上的 GCC(并且只有那里)):
void clear_mbstate (std::mbstate_t & mbs);
void
towstring_internal (std::wstring & outstr, const char * src, std::size_t size,
std::locale const & loc)
{
if (size == 0)
{
outstr.clear ();
return;
}
typedef std::codecvt<wchar_t, char, std::mbstate_t> CodeCvt;
const CodeCvt & cdcvt = std::use_facet<CodeCvt>(loc);
std::mbstate_t state;
clear_mbstate (state);
char const * from_first = src;
std::size_t const from_size = size;
char const * const from_last = from_first + from_size;
char const * from_next = from_first;
std::vector<wchar_t> dest (from_size);
wchar_t * to_first = &dest.front ();
std::size_t to_size = dest.size ();
wchar_t * to_last = to_first + to_size;
wchar_t * to_next = to_first;
CodeCvt::result result;
std::size_t converted = 0;
while (true)
{
result = cdcvt.in (
state, from_first, from_last,
from_next, to_first, to_last,
to_next);
// XXX: Even if only half of the input has been converted the
// in() method returns CodeCvt::ok. I think it should return
// CodeCvt::partial.
if ((result == CodeCvt::partial || result == CodeCvt::ok)
&& from_next != from_last)
{
to_size = dest.size () * 2;
dest.resize (to_size);
converted = to_next - to_first;
to_first = &dest.front ();
to_last = to_first + to_size;
to_next = to_first + converted;
continue;
}
else if (result == CodeCvt::ok && from_next == from_last)
break;
else if (result == CodeCvt::error
&& to_next != to_last && from_next != from_last)
{
clear_mbstate (state);
++from_next;
from_first = from_next;
*to_next = L'?';
++to_next;
to_first = to_next;
}
else
break;
}
converted = to_next - &dest[0];
outstr.assign (dest.begin (), dest.begin () + converted);
}
void
clear_mbstate (std::mbstate_t & mbs)
{
// Initialize/clear mbstate_t type.
// XXX: This is just a hack that works. The shape of mbstate_t varies
// from single unsigned to char[128]. Without some sort of initialization
// the codecvt::in/out methods randomly fail because the initial state is
// random/invalid.
std::memset (&mbs, 0, sizeof (std::mbstate_t));
}
这个函数是 log4cplus 库的一部分,它可以工作。它使用 codecvt
facet 来进行转换。你必须给它适本地设置 locale
。
Visual Studio 可能无法为您正确设置 GB2312 的语言环境。您可能必须使用 _setmbcp()
才能使其正常工作。有关详细信息,请参阅“double byte character sequence conversion issue in Visual Studio 2015”。
关于c++ - 插入窄字符串到 std::basic_ostream<wchar_t>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32907986/
我的 friend 给我发了一个代码,他说在 Windows 中成功编译。我在linux上尝试过,但未能给出以下错误。下面是代码的最小可验证示例。 #include #include using
搜索这个问题的标题给了我很多人引用相同的错误,但在不同的情况下,不幸的是那里提供的答案是针对他们的情况的,我看不出他们能如何帮助我。 我正在尝试重载 operator template class
我已经看过几个关于这个的问题,特别是 Overloading operator&&’很有帮助。它让我知道我的问题是我正在做一些 c++11 无法从中推断出类型的事情。 我认为我的问题的很大一部分是我正
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
在这段代码中,我尝试将迭代器移动 10 个元素。 #include #include #include int main() { using
你好everonye即使我在这里找到了很多关于这个问题的答案,但一个人根本无法向我解释事情的进展如何无法解决它。 所以我的问题是我有一个名为 Matrix 的类,当我尝试将运算符 }’ lvalue
如何在 C++ 中打印 high_resolution_clock? #include #include typedef std::chrono::high_resolution_clock hi
关于这个标题的 StackOverflow 有很多关于这个标题的问题,但没有一个对我有帮助,我真的不明白发生了什么。 我正在尝试创建一个生成随机单词的类。首先,我尝试将所有元音和辅音放在两个不同的 s
我在尝试做一些简单的事情时遇到了一个令人困惑的错误消息 std::cout {1,2,3}; 上面写着 cannot bind 'std::ostream {aka std::basic_ostre
我在尝试编译我的代码时遇到此错误: 1> c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/ostream: In constructor 'Log
我想知道如何在 std::basic_ostream 中插入参数我一直在努力,但我做不到 我需要插入一个参数来选择我想要打印的 arista 值一旦我插入了参数,下一步就很容易了,因为它只是一个 if
根据 cppref , 有一个 operator 过载接受 const char* .似乎转换操作只是加宽了每个 char进入 wchar_t .也就是说,转换(插入)的宽字符数等于窄字符数。那么问
为什么使用用户定义的类进行流操作的典型 header C通常是这样的: std::ostream& operator>(std::istream& is, C&); 不是这样的: template
我想提供一个流运算符来输出 std::chrono::time_point 作为 GMT 日期,我目前有以下内容(仅针对 ostream 进行了简化): using datetime_t = std:
我正在阅读 basic_ostream 对象的 write 方法,这是我在 cppreference 上找到的内容: basic_ostream& write( const char_type* s,
这个问题在这里已经有了答案: Misunderstanding about ostream class and operator << (5 个答案) 关闭 8 年前。 标题是我的问题。 basic
我收到以下错误,我不确定是什么问题 1 IntelliSense: "std::basic_ostream::basic_ostream(const std::basic_ostream::_Myt
上面有转换吗? 最佳答案 将std::string 转换为输出 流?通常是:将字符串转换为从给定字符串中读取字符的输入流: std::string myString = //... std::istr
就在我认为我了解 C++11 中 iostream 的多遍移动构造时(感谢 https://stackoverflow.com/a/8156356/273767 的介绍),我遇到了这个: §27.7.
§27.7.3.9为 operator basic_ostream& operator&& os, const T& x); Effects: os > 的右值重载。) 基本上,它只是转发到左
我是一名优秀的程序员,十分优秀!