2010年04月12日
QTextCodec の初期化ではまりました。
Windows で Qt アプリを書いているのですが、Qt の文字列クラス QString はデータを Unicode で持っているので、例えばダイアログから取得した文字列を外部の API や関数に渡す際には Shift-JIS などに変換する必要があります。
# Unicode や Shift-JIS という用語はあいまいなので良くないのですが… 簡単のため。本当は ISO/IEC 10646 や Windows-31J (旧 cp932) と書くべきだと思います。
QTextCodec クラスを使えば良いだけなのですが、なぜか Codec が初期化できなくて苦労しました。(QTextCodec::codecForName("Shift-JIS") が NULL を返す。)
原因は、日本語のコーデック (qjpcodecs) がプラグインになっていたため、プラグインを読み込む (qjpcodecs は静的プラグインなので、静的リンクされるのですが) 必要があったのでした。
Windows 環境でしか試してないのですが、他の環境でも同じなのでしょうか ?
なかなか気が付きにくいのではないかと思います。
/* jpcodec.cpp */ #include <QTextCodec> /* 以下の 2 行が無いとエラーになる */ #include <QtPlugin> Q_IMPORT_PLUGIN(qjpcodecs) /* リンク時には -L<path/to>\qt\4.3.2\win32\plugins\codecs -lqjpcodecs -lqtcore などが必要。 */ int main() { QTextCodec *sjis = QTextCodec::codecForName("Shift-JIS"); if (!sjis) { fprintf(stderr, "error\n"); return -1; } return 0; }