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で保存してください。

ただ単に日本語などの文字列をユニコードに変換するだけならこの関数を使うのが便利です。

文字コードを統一する

QStringfromLocal8Bit関数を使って文字コードを環境に合わせて設定する方法もありますが、これを呼び出さずにプログラムの開始時点でどの文字コードを使うか決めることも出来ます。

メインである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"))

のように文字コードの名前を文字列で渡します。

関連項目
プライバシーポリシー