QStringの文字化け対策
QTではユニコード(UTF-16)を標準の文字コードとして使っています。
ユニコードにもいろいろ種類がありますが、QTではUTF-16を使っているので2バイト長で文字を扱っているみたいです。
そのためshift_jisやeucなどのユニコード以外の文字列はそのままだと文字化けしてしまいます。
そこでQStringというQt専用の文字列型がユニコードを扱うのに用意されています。
QStringクラスについて
このクラスには別の文字コードをユニコードに変換したり、ユニコードを操作するためのいろいろなメンバ関数が用意されています。
ここではまず初めに文字コードの変換をしてみたいと思います。以下のソースファイルを見てください。
#include <QApplication> #include <QtGui> int main(int argc, char ** argv) { QApplication app(argc, argv); QString str1 = "こんにちは"; QString str2 = QString::fromLocal8Bit("こんにちは"); //現在のプラットフォームの文字コードをユニコードに変換 QLabel label1("こんにちは"); QLabel label2(str2); label1.setGeometry(5, 5, 50, 10); label2.setGeometry(5, 25, 50, 10); label1.show(); label2.show(); return app.exec(); }
このソース内でstrはユニコード変換していない文字列、str2はユニコード文字列です。
このプログラムを実行すると、label1には文字化けした文字列、label2にはしっかりと「こんにちは」と表示されます。
なぜ str1 が文字化けしてしまうかというとchar型の配列にはユニコードではなく、そのプログラムを作った環境の文字コードが使われるからです。>
一方 str2 はfromLocal8Bit関数でユニコードに変換されています。
この時ソースコード自体の文字コードは必ずUTF-8で保存してください。
ただ単に日本語などの文字列をユニコードに変換するだけならこの関数を使うのが便利です。
文字コードを統一する
QStringのfromLocal8Bit関数を使って文字コードを環境に合わせて設定する方法もありますが、これを呼び出さずにプログラムの開始時点でどの文字コードを使うか決めることも出来ます。
メインであるmain.cppでその処理を行います。
main.cpp#include <QApplication> #include <QtGui> int main(int argc, char ** argv) { QApplication app(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); //プログラム全体での文字コードの設定 /*...略...*/ return app.exec(); }
QTextCodecという文字コードのコーデックをするクラスのスタティックな関数setCodecForCStringsにローカルな文字コードを返すcodecForLocale関数を渡しています。
また、特定の文字コード(Shift-JISなど)を指定したい場合は、
QTextCodecForCStrings(QTextCodec::codecForName("Shift-JIS"))
のように文字コードの名前を文字列で渡します。