CLX C++ Libraries
Home >> utf8

Overview

近年,テキストの文字コードとして UTF-8 が広く利用されるようになりました. しかし,UTF-8 は 1 文字を 1--4Byte で表現するため,文字数のカウントなどが若干面倒になります. clx::utf8 はそう言った UTF-8 エンコードの文字列を扱うための補助関数群になります.

clx::utf8 は,UTF-8 エンコードの文字列は char 型で扱う事を想定しています. そのため,現在のところ wchar_t 型の引数を取る関数は提供していません.

Example

example_utf8.cpp

#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() メソッドは,引数に指定された文字列の文字数を返します.

Reference

  1. UTF-8 の文字列を操作するための補助関数群 - Life like a clown