2010年05月10日

Qt の文字コード変換を制御する環境変数 UNICODEMAP_JP

twitter でも follow させていただいている森山さんから、前回の QTextCodec の円記号問題についてコメントいただきました。ありがとうございました。

さっそく試してみました。



以下のように、円記号を Shift-JIS から Unicode に変換して、それを 16 進数で表示するテストプログラムを作成しました。

C:\test\qt>cat codec.cpp
#include <QTextCodec>
#include <QtPlugin>
Q_IMPORT_PLUGIN(qjpcodecs)

int main()
{
    QTextCodec *sjis = QTextCodec::codecForName("Shift-JIS");

    if (!sjis) {
        fprintf(stderr, "error\n");
        return -1;
    }

    QString yenSign = sjis->toUnicode("\\");

    ushort &data = yenSign.data()->unicode();

    printf("0x%x\n",data);

    return 0;
}

普通に実行すると、やはり U+00a5 に変換されます。

C:\test\qt>codec.exe
0xa5

UNICODEMAP_JP 環境変数を設定してから実行すると。

C:\test\qt>set UNICODEMAP_JP=cp932

C:\test\qt>codec.exe
0x5c

なるほど、確かに結果が変わります。

Qt の Shift-JIS コーデックは、環境変数 UNICODEMAP_JP によって、cp932 変換表の指定の他にも、nec-vdc や ibm-vdc (ベンダー定義文字)、udc(ユーザ定義文字)などの Windows 機種依存文字サポートも指定できるそうです。(これらの詳細は、ちょっと私はあまり深く理解していないのですが…。)

これはこれで良いのですが、環境変数を設定するというのは少し面倒ですし (アプリケーションのインストール時に設定する、あるいは putenv() などの関数でアプリケーション側から設定すれば良いのでしょうか。)、影響が環境全体に及んでしまうので微妙な気もします。

QTextCodec の初期化時などにパラメータとして渡してやれた方が、個別のアプリケーションごとに設定できて便利な気もするのですが、何か理由があるのでしょうか。



トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード