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 での文字コード処理を複雑にしている主な原因です。


具体的なパッチの作り方

  1. ascii(), latin1() を見つける。

    QString::ascii(), latin1() を用いているところがあれば、
    そこに日本語などが入る可能性があるときには local8Bit() へ変更します。
    ※ utf8()でも十分な場合は utf8() を。
    場合によっては const char * へのキャストをつける。

  2. sprintf は要注意

    QString::sprintf() の %s の文字列のところには UTF-8 しか受け付けません。
    UTF-8 に変換して渡してください。

    1. ascii() を使っていた場合
      utf8()に変換。さらに const char * へキャストしてください。
      QString str, str2;
      str.sprintf("%s", str2);
      ---> str.sprintf("%s", (const char *)str2.utf8());
      
    2. char * をそのまま渡している場合
      UTF-8 の文字列を渡してる場合は問題なし。
      locale 文字列 (EUC など) を渡している場合には UTF-8 に変換してください。
      (const char *) QString::fromLocal8Bit(str).utf8()
      
    3. QString::sprintf() の format は現状で日本語などは受け付けません
      qstring.sprintf(unicodestr, args, ...);
      ---> qstring = QString::fromUtf8(QCString().sprintf(unicodestr.utf8(), args, ...));
      
  3. QStrList も要注意。

    QStrList は QString ではなく、 char * のリストです。
    QStringとのやり取りを行なう場合には変換をしてください。

    • QStrList へデータを格納する場合
      append(), insert() などでデータを挿入する場合には
      QString::local8Bit() または QString::utf8() で変換してください。

    • QStrList からデータを取り出す場合
      at() などでデータを取り出す場合、
      QString::fromLocal8Bit() で QString へ変換します。
      utf8() で格納した場合、QString::fromUtf8() で変換してください。

All units are in pixels unless otherwise specified

最終更新日: 2000年8月6日