nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Qt5で日本語文字列を扱おうとすると文字化けするので、その対処方法

文字列リテラルを QString へ変換する

Qt5では文字列リテラルを QString へ変換するには主に以下のメソッドを使用可能。

  • QString::fromLatin1()

    • Latin1(ISO-8859-1) として QString を作成
  • QString::fromLocal8Bit()

    • 現在のロケールに合わせたコーデックを使用して QString を生成します
  • QString::fromUtf8()

    • 文字列が UTF-8 として QString を作ります

以下にマクロを使用しないパターンと使用するパターンを記載します。

[マクロ未使用パターン]

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QStringList qStrList;

    // QString::fromLocal8Bit() ⇒ 現在のロケールに合わせたコーデックを使用して QString を生成します
    QString temp = QString::fromLocal8Bit("日本語");


    for (int i = 0; i < 100; i++) {
        QString qStrTest = temp;
        qStrList.append(qStrTest);
    }

    foreach (QString item, qStrList) {
        qDebug() << item;
    }
}

[マクロ使用パターン]

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QDebug>

#define Jstr(str) QString::fromLocal8Bit(str)

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QStringList qStrList;

    QString temp = Jstr("日本語");

    for (int i = 0; i < 100; i++) {
        QString qStrTest = temp;
        qStrList.append(qStrTest);
    }

    foreach (QString item, qStrList) {
        qDebug() << item;
    }
}

実行結果

実行結果は、以下のとおりです。日本語文字列を使用しても、文字化けが発生しません。

f:id:nprogram:20170810074356p:plain

以下の記事のサイトを参考にさせていただきました。ありがとうございます。

qt-labs.jp

  • Qtのマクロについて

loops.at.webry.info