KDE-2 アプリの国際化の方法
!
Qt は ver.2 以降、内部コードが Unicode 化されています。
文字列は EUC のまま渡すと文字化けしてしまいます。
そのため Unicode に変換してから渡す必要があります。
内部処理の際にも Unicode であることを意識して行う必要があります。
これらは他のライブラリではあまり見掛けない独特な手法です。
そこで Unicode 関連の処理についてまとめてみました。
Unicode について
Unicode とは世界中の主要な文字を単一の文字テーブルに定義したものです。
テーブルは 16bit で表され、理論上 65,536 文字を収録することができます。
16bit で表された Unicode 体系を UCS-2 といいます。
従来の char* 型文字列では UCS-2 を処理することができません。
そのためマルチバイト処理により 8bit 化して
char* 型文字列として扱えるようにした規格が UTF-8 です。
UCS-2 と UTF-8 との変換では情報の欠損がないため、
表記内容を等価な物として扱うことができます。
そのため char* 型で処理する必要がある場合には、
一時的に UTF-8 に変換して処理後に UCS-2 に戻すという作業が必要になります。
処理対象が UCS-2 または UTF-8 のみであれば
特に難しいことを考えなくても取り扱うことができるのですが、
現状では EUC など従来の文字コードがメインのためそうもいきません。
これが Qt での文字コード処理を複雑にしている主な原因です。
具体的なパッチの作り方
- ascii(), latin1() を見つける。
QString::ascii(), latin1() を用いているところがあれば、
そこに日本語などが入る可能性があるときには local8Bit() へ変更します。
※ utf8()でも十分な場合は utf8() を。
場合によっては const char * へのキャストをつける。
- sprintf は要注意
QString::sprintf() の %s の文字列のところには UTF-8 しか受け付けません。
UTF-8 に変換して渡してください。
- ascii() を使っていた場合
utf8()に変換。さらに const char * へキャストしてください。
QString str, str2; str.sprintf("%s", str2); ---> str.sprintf("%s", (const char *)str2.utf8());
- char * をそのまま渡している場合
UTF-8 の文字列を渡してる場合は問題なし。
locale 文字列 (EUC など) を渡している場合には UTF-8 に変換してください。(const char *) QString::fromLocal8Bit(str).utf8()
- QString::sprintf() の format は現状で日本語などは受け付けません。
qstring.sprintf(unicodestr, args, ...); ---> qstring = QString::fromUtf8(QCString().sprintf(unicodestr.utf8(), args, ...));
- ascii() を使っていた場合
- QStrList も要注意。
QStrList は QString ではなく、 char * のリストです。
QStringとのやり取りを行なう場合には変換をしてください。
- QStrList へデータを格納する場合
append(), insert() などでデータを挿入する場合には
QString::local8Bit() または QString::utf8() で変換してください。
- QStrList からデータを取り出す場合
at() などでデータを取り出す場合、
QString::fromLocal8Bit() で QString へ変換します。
utf8() で格納した場合、QString::fromUtf8() で変換してください。
- QStrList へデータを格納する場合
All units are in pixels unless otherwise specified
最終更新日: 2000年8月6日