【发布时间】:2015-09-25 01:17:46
【问题描述】:
我有一个 char 迭代器 - 一个 std::istreambuf_iterator<char> 包装在几个适配器中 - 产生 UTF-8 字节。我想从中读取一个 UTF-32 字符(char32_t)。我可以使用 STL 这样做吗?怎么样?
有std::codecvt_utf8<char32_t>,但显然只适用于char*,而不是任意迭代器。
这是我的代码的简化版本:
#include <iostream>
#include <sstream>
#include <iterator>
// in the real code some boost adaptors etc. are involved
// but the important point is: we're dealing with a char iterator.
typedef std::istreambuf_iterator< char > iterator;
char32_t read_code_point( iterator& it, const iterator& end )
{
// how do I do this conversion?
// codecvt_utf8<char32_t>::in() only works on char*
return U'\0';
}
int main()
{
// actual code uses std::istream so it works on strings, files etc.
// but that's irrelevant for the question
std::stringstream stream( u8"\u00FF" );
iterator it( stream );
iterator end;
char32_t c = read_code_point( it, end );
std::cout << std::boolalpha << ( c == U'\u00FF' ) << std::endl;
return 0;
}
我知道 Boost.Regex 对此有一个迭代器,但我想避免使用非标头的 boost 库,这感觉就像 STL 应该具备的能力。
【问题讨论】:
-
不要使用stl 标记,除非您真的指的是 STL,即 1990 年代的库,大部分 C++ 标准库都源自该库
-
哦,我明白了。感谢您的提示。
-
@JonathanWakely 常见用途、标签 wiki、标签缩写形式以及该术语的实用性(谁,真的,不再谈论原始 STL 了?)有点不同意你的看法。我的意思是,迂腐很有趣,但 SO 不仅仅是有趣。
-
@Yakk,不,标签 wiki 说将整个 C++ 标准库称为 STL 是不正确的。无论如何,
std::codecvt_utf8是 Locales 子句的一部分,这很好地证明了我的观点,因为std::locale不是模板,也不是“STL”的一部分。没有人再谈论 STL 的事实是避免使用标签的好理由,not 用它来表示不同的意思。标准库的重要部分是不是模板(std::thread,有人吗?)所以这是错误的。 c++ 标记完全可以解决有关 C++ 标准库的问题! -
@Yakk,标签缩写形式与您矛盾:“STL 的大部分被采用到标准库中,标准库中的 这些部分 有时也被引用集体作为...“(强调我的)语言环境从来都不是这些部分之一,
codecvt_utf8是 C++11 中的新内容,绝对不是这些部分之一!所以在所有方面都错了;-)