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