はじめに
本記事ではPOCO(C++ Portable Componentsの略)というオープンソースのC++用クラスライブラリを紹介します。POCOはコンポーネントとして6つのライブラリにわかれており、前回は、その中のPOCO::Foundationライブラリから、Loggingに関するクラス群を紹介しました。
POCO::Foundationライブラリは、名前のとおり基本的な処理を行うクラスを集めたもので、そのまま実践に使えるクラスが豊富に含まれています。今回からしばらくは、そんなPOCO::Foundationライブラリから、テーマごとにクラスをピックアップし、サンプルコードを交えて解説していくことにします。今回のテーマは、テキスト処理を取りあげました。また、POCOには含まれていないシフトJISとUTF-8の相互変換関数のソースコードも公開しています。
これまでの記事
対象読者
オブジェクト指向を理解し、ネイティブC++のクラスライブラリを活用できる方を対象としています。
必要な環境
POCOは、多様なプラットフォームで動作可能で、Windows、Mac OS X、Linux、HP-UX、Tru64、Solaris、QNXでの動作を保証しています。コンパイラは、いわゆる標準C++のコードに対応したものが必要です。POCO内部でSTLを使用しています。
本記事では、Windows XP上で、Microsoft Visual C++ 2005 Express Edition(以下、VC 2005 Expressとします)(+Windows Platform SDK)という環境で、動作検証を行いました。なお、原稿執筆時点でのPOCOの最新バージョンは1.3.1です。
POCOでのテキスト処理
C言語やネイティブのC++言語は、一般的にテキスト処理に向いているとは言えません。テキスト処理に限った話ではありませんが、標準のライブラリが貧弱なので低レベルの部分から作る必要があるからです。POCOには、テキスト処理の関数やクラスがいくつかありますので、場合によっては非常に便利に使えると思います。いずれも基本的なもので、POCO::Foundationライブラリに含まれています。
テキスト処理と言うと、マルチバイト文字の問題も避けては通れません。POCOは「Applied Informatics」というオーストリアの会社が提供している関係で、日本語のようなマルチバイトのテキスト処理については多少不安があるのも事実です。前稿でも日本語に関する不具合を指摘していますが、日本語を含む文字列を扱う場合は注意しておいた方がいいかもしれません。
POCOでは、UnicodeのUTF-8コードに対応することで基本的にはマルチバイトに対応しています。文字列はUTF-8コードでエンコードされていると見なして内部の処理を行っています。Windows環境でAPIを利用する場合では、デフォルトで「POCO_WIN32_UTF8」というシンボルがdefine定義されていて、Unicode版のWin32 APIを利用するコードがコンパイルされます。処理としては、APIに渡す引数の文字列をPOCO内部でUTF-8からUTF16コードに変換しています。
UTF-8
UTF-8コードというのは、Unicodeの実装の1つで1文字を1~6バイトのマルチバイトで符号化したものです。ASCII文字と同じ部分は、同じコードのまま1バイトになります。ただし、ASCII文字以外は2バイト以上になってしまい、日本語の漢字は少なくとも3バイトになってしまいます。しかしそのコードには、ASCII文字と重複するものがなく、ASCII文字とは明確に区別することができます。シフトJISでは2バイト目に\記号のコードと重複する文字があって、文字化けの原因になったりしていましたが、UTF-8ではその心配はありません。従来のASCII文字の処理をほとんど変更することなく使えます。
UTF-16
一方、UTF-16コードは2バイトで表現できるUnicodeの文字はそのままのコードで、それ以外の文字は独自にエンコードして4バイトで表します。基本の文字単位が2バイトとなりますので、UTF-8のマルチバイト文字に対してこちらはワイド文字と呼ばれます。ASCII文字も日本語も2バイトになります。そのため、UTF-16に対応した文字列クラスもstd::wstringと別のクラスになっています。