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;
}