赤紫蘇2 リファレンス

文字コードと文字コード変換エンジン

akaxiso2.0-beta3


赤紫蘇2リファレンス

1.概要
1.1 赤紫蘇2の構成
1.2 プログラムの
開始から終了まで
1.3 文字コードと
文字コード変換エンジン
1.4 名前空間とQName
1.5 マルチスレッディング

2. 赤紫蘇2データモデル
2.1 チュートリアル
2.2 パーティクル
2.3 aka:sequence
2.3.1 単純型の子要素
2.3.2 複合型の子要素
2.3.1 配列型
2.4 aka::all
2.5 aka:choice
2.5.1 複雑型の子要素
2.5.2 単純型の子要素
2.5.3 バインダクラス
2.5.4 子要素オブジェクト
(aka::item)の扱い
2.5.5 子要素の出現頻度
2.6 属性
2.7 aka:simpleContent
2.8 単純型(aka:simleType)
2.8.1

組み込み型

2.9

配列とポインタ

2.,10 ワイルドカード

3 XMLによる永続化
3.1 シリアライズ
3.2 デシリアライズ

付表
A ライブラリ主要API
B XML Schemaとの
機能対応表
C リリースノート

赤紫蘇2の内部では、三種類の文字コードが現れます。

一つ目は、Local Code Page (以降LCP)です。いわゆる、プラットホームにおけるデフォルトの文字コードです。日本語環境であるなら、WindowsではShift_JIS(正確にはCP932)、UNIX環境では、eucJPが代表的です。(Fedora Core 4などは、UTF-8をデフォルトのコードページとする。)

二つ目は、赤紫蘇2の内部エンコーディングであり、Unicodeが用いられます。具体的なエンコーディングとしては、UTF-8、もしくは、UCS-2のうちの一つをライブラリのコンパイル時に選択します。このエンコーディングは、XMLのパース時や単純型の妥当性検証時に用いられます。

三つ目は、XMLドキュメントの文字コードです。これは、XMLドキュメント中のXML文書宣言でencode="eucJP"などとして指定される文字コードであり、XML文書のエンコーディングを示します。このエンコーディングは、XMLドキュメント(それぞれのXML文書)固有です。

文字コードの指定

それぞれの文字コードは、以下のように指定されます。

・LCP

Local Code Pageは、プラットフォームにより値が異なります。一般的な例では、Windowsでは、shift_jis、Linux(UNIX系)では、eucJPとなります。
赤紫蘇2におけるLCPの指定は、プログラムのソース中で使用されるリテラル文字列のエンコーディングと一致していなければなりません。たとえば、UTF-8でリテラル文字列が書かれている場合には、LCPとしてUTF-8を設定する必要があります。また、このエンコーディングは、シリアライズ時のデフォルトエンコーディングとしても、使用されます。

赤紫蘇2のデフォルトでは、LCPが自動判定されます。その方法は、Windows、Linux(UNIX系)で異なります。また、別途、エンコーディングを明示的に指定することもできます。

Windows環境では、以下の要領でLCPを決定します。

まず、aka::set_default_encoding()関数により、指定されるエンコーディングが最優先で使用されます。aka::set_default_encoding()は、エンコーディング名を引数として持ちます。また、は、aka::initialize()の前に呼び出される必要があります。

aka::set_default_encoding("Shift_JIS");
aka::initialize();

次に優先されるのが、LCPの指定として最も優先されるのが、AKAXISO2_DEFAULT_ENCODINGマクロの値です。以下のコードによりエンコーディング名を#defineすることで、LCPを指定することができます。

#define AKAXISO2_DEFAULT_ENCODING="文字コードの名前"

上記の方法による指定が無い場合、赤紫蘇2は、GetACP()関数で得られたコードページを用います。システム内部に格納されているエンコーディング名とコードページの対応表から、エンコーディング名を決定します。Windowsの日本語環境では、コードページが932、対応するエンコーディング名は、"shift_jis"となります。

Linux(UNIX系)では、以下のルールに従います。

まず、aka::set_default_encoding()が呼び出されている場合、その値を用います。

次に、まず、AKAXISO2_DEFAULT_ENCODINGが#defineされている場合は、その値を用います。ここまでは、Windowsと同様です。

その次に、LANG環境変数を確認します。
たとえば、LANGの値が"ja_JP.eucjP"であるならば、"."以降の"eucJP"を用います。

LANG環境変数が定義されていなかった場合、最後に、National Language System(NLS)を参照し、LCPを決定します。

・内部エンコーディング

内部エンコーディングは、Unicodeです。UTF-8、UCS-2のどちらかを使用可能です。

このエンコーディングは、コンパイル時に決定します。AKAXISO2_INTERNAL_UCS2マクロが定義されていると、UCS-2を内部エンコーディングとして用います。
内部エンコーディングをUTF-8にするには、このマクロを#undefします。デフォルトは、UTF-8となっています。

Windowsの場合には、akaxiso2/config_win32.hにマクロ定義があります。また、Linux(UNIX系)では、configureスクリプトにより、設定します。

・XMLドキュメントエンコーディング

XMLドキュメントエンコーディングは、それぞれのXML文書(インスタンス)に固有です。

赤紫蘇2が使用している文字コード変換エンジンがサポートしているエンコーディングが使用可能です。
ドキュメントのエンコーディングを、文字コード変換エンジンがサポートしていない場合には、デシリアライズ時に、例外が投げられます。

文字コード変換エンジン

赤紫蘇2は、実際の文字コードの変換処理を、ライブラリ外部の文字コード変換エンジンに委託します。

現在、サポートされている文字コード変換エンジンは、以下の四つです。

・iconv

UNIX上での使用を想定しています。

・ICU (International Component for Unicode)

IBMからオープンソースとしてリリースされている文字コード変換エンジンです。
Windows、UNIX系の両者で使用することができます。

・MLang

WindowsのIEなどで用いられている文字コード変換エンジンです。
IE4以降がインストールされているWindowsマシンで使用することができます。
Windows限定です。

・Win32

いわゆるWin32のMultibyteToWideChar()などの関数を用いて文字コード変換を行います。
この文字コード変換エンジンは、LCPとUnicodeの変換時にのみ、使用可能です。
Windows限定です。


赤紫蘇2トップへ sourceforgeプロジェクトページへ