【问题标题】:C++ - Using istream_iterator with wstringstreamC++ - 将 istream_iterator 与 wstringstream 一起使用
【发布时间】:2014-01-06 21:08:05
【问题描述】:

我正在尝试将 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

【问题讨论】:

  • 没有 API(除了 Windows,真的)使用宽字符。如果您想获得 Unicode 支持,UTF-8 是普遍接受的选项。
  • 是的,我希望我的代码支持 UTF-8。我的理解是 std::wstring 是 UTF-8 字符串的 STL 版本。

标签: c++ unicode std


【解决方案1】:

试试:

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

...看看是不是效果更好。

关于 cmets:不,这 不是 用于 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 的方法是什么?
  • @BenjyKessler,有一些库,比如 ICU,但前提是使用 std::string,其中字符是 UTF-8 字符串的编码。 @Jerry,C++11 也包括这样的设施,尽管我在实现支持方面运气不佳。糟糕,我想这已经在页面上讨论过了。
猜你喜欢
  • 2021-04-06
  • 1970-01-01
  • 2012-06-08
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多