C++ - 使用 istream_iterator 和 wstringstream

7
我正试图为我编写的程序添加Unicode支持。我的ASCII代码已经编译并具有以下行:
std::stringstream stream("abc");
std::istream_iterator<std::string> it(stream);

我把这个转换成了:
std::wstringstream stream(L"abc");
std::istream_iterator<std::wstring> it(stream);

在 istream_iterator 构造函数中,我收到了以下错误:

error C2664: 'void std::vector<_Ty>::push_back(std::basic_string<_Elem,_Traits,_Alloc> &&)' : cannot convert parameter 1 from 'std::basic_string<_Elem,_Traits,_Alloc>' to 'std::basic_string<_Elem,_Traits,_Alloc> &&'
1>          with
1>          [
1>              _Ty=std::wstring,
1>              _Elem=wchar_t,
1>              _Traits=std::char_traits<wchar_t>,
1>              _Alloc=std::allocator<wchar_t>
1>          ]
1>          and
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]
1>          and
1>          [
1>              _Elem=wchar_t,
1>              _Traits=std::char_traits<wchar_t>,
1>              _Alloc=std::allocator<wchar_t>
1>          ]
1>          Reason: cannot convert from 'std::basic_string<_Elem,_Traits,_Alloc>' to 'std::basic_string<_Elem,_Traits,_Alloc>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]
1>          and
1>          [
1>              _Elem=wchar_t,
1>              _Traits=std::char_traits<wchar_t>,
1>              _Alloc=std::allocator<wchar_t>
1>          ]
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

如何将上面的代码正确转换为Unicode?

谢谢。

附言:

我正在运行Visual Studio 2012。


3
除了 Windows API 外,几乎没有其他 API 使用宽字符。如果您需要支持 Unicode,UTF-8 是通常接受的选项。注意,这里的翻译并未改变原文的意思,只是将其表达得更加通俗易懂。 - chris
是的,我希望我的代码支持UTF-8。我理解的是std::wstring是STL版本的UTF-8字符串。 - Benjy Kessler
1个回答

11

尝试:

std::wstringstream stream(L"abc");
std::istream_iterator<std::wstring, wchar_t> it(stream);

关于建议:不,这并不是为了UTF-8。它是为了(或多或少地)直接从包含UTF-16的文件中读取,然后转换为包含UTF-16的字符串。根据编译器以及使用wchar_t的大小,也可能是UTF-32,但(大概)永远不会是UTF-8。

如果要从文件中读取UTF-8并将其转换为类似于UTF-32的内部格式,您可以考虑查看Boost.locale,其中包括一个utf-to-utf的codecvt facet。


像魔法一样。这只适用于UTF-16还是也适用于UTF-8?如何在UTF-8中实现这个功能呢? - Benjy Kessler
@BenjyKessler,有一些库可以使用,比如ICU,但前提是使用std::string,其中字符是UTF-8字符串的编码。@Jerry,C++11也包括这样的功能,尽管我在实现支持方面运气不太好。哎呀,我想这在页面上已经讨论过了。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接