Overview
近年,テキストの文字コードとして UTF-8 が広く利用されるようになりました. しかし,UTF-8 は 1 文字を 1--4Byte で表現するため,文字数のカウントなどが若干面倒になります. clx::utf8 はそう言った UTF-8 エンコードの文字列を扱うための補助関数群になります.
clx::utf8 は,UTF-8 エンコードの文字列は char 型で扱う事を想定しています. そのため,現在のところ wchar_t 型の引数を取る関数は提供していません.
Example
#include <iostream> #include <string> #include "clx/utf8.h" int main(int argc, char* argv[]) { std::string s = "はろーわーるど! This is a UTF-8 test program."; std::cout << "size: " << s.size() << std::endl; std::cout << "char count: " << clx::utf8::distance(s) << std::endl; std::string::iterator pos = s.begin(); int n = 0; while (pos != s.end()) { clx::utf8::advance(pos, 1); clx::utf8::advance(pos, -1); clx::utf8::advance(pos, 1); ++n; } std::cout << "char count: " << std::dec << n << std::endl; pos = s.begin(); while (pos != s.end()) { std::string dest; clx::utf8::get(pos, s.end(), std::insert_iterator<std::string>(dest, dest.end())); for (size_t i = 0; i < dest.size(); ++i) { std::cout << "<" << std::hex << (static_cast<size_t>(dest.at(i)) & 0xff) << ">"; } std::cout << std::endl; } return 0; }
Functions
全ての関数は,utf8 名前空間の中に定義してあります.
template <class InIter> size_t get(InIter& first, InIter last); template <class InIter, class OutIter> OutIter get(InIter& first, InIter last, OutIter out); template <class InIter, class OutIter> OutIter get(InIter& first, InIter last, OutIter out, size_t n);
get() メソッドは,first の位置から 1 文字取得し,1 文字分 (1--4Byte) イテレータを先に進めます.引数が入力イテレータのみ場合は,1 文字分の値を size_t の変数に格納し,その値を返します.引数に出力イテレータも指定された場合は, 指定された出力イテレータに 1 文字分の値を格納します. 出力イテレータの他に整数も指定された場合には,指定された文字数分だけ格納します.
template <class InIter> size_t peek(InIter first, InIter last);
get() メソッドは,引数に指定された入力イテレータ first を取得したバイト数分だけ前進させます. これに対して,peek() メソッドは引数に指定された入力イテレータの値を変化させません.
template <class InIter> void advance(InIter& pos, int n);
advance() メソッドは,現在の位置から n 文字分だけイテレータを先に進めます. ただし,n に負の整数を指定した場合には n 文字分だけイテレータを後ろに戻します.
template <class InIter> size_t distance(InIter first, InIter last); size_t distance(const std::string& s); size_t distance(const char* s);
distance() メソッドは,引数に指定された文字列の文字数を返します.