2010年05月10日
Qt の文字コード変換を制御する環境変数 UNICODEMAP_JP
以下のように、円記号を 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 の初期化時などにパラメータとして渡してやれた方が、個別のアプリケーションごとに設定できて便利な気もするのですが、何か理由があるのでしょうか。