KDE Project

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とのやり取りを行なう場合には変換をしてください。


日本KDEユーザ会トップページ


このサイトは日本KDEユーザ会が著作権を有します。本著作権を表示する限りにおいて転載を許可します。
Copyright (C) 1999-2000 Japan KDE Users' Group. All Rights Reserved.
このサイトに関するご意見・お問い合わせはtino@kde.gr.jp(井上)まで。
最終更新日:2000年8月6日
メーリングリスト ダウンロード ニュース KDEとは