のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

QT5 Android SJIS 文字化け

SJISのフォントデータで、文字が化けてしまう。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFileDialog>
#include <QFontDatabase>
#include <QMessageBox>
#include <QTextCodec>
#include <QString>

#define TR(s) (QString::fromLocal8Bit(s))

bool MainWindow::canOpenFontFile(QString fileName)
{
    if (fileName.isEmpty())
    {
        return false;
    }   else {
        QFile file(fileName);
        if (!file.open(QIODevice::ReadOnly))
        {
               QMessageBox::information(
                    this, TR("Unable to open file:\n"),
                           file.errorString()+"\n"+fileName);
               return false;
        }
    }
    return true;
}

bool MainWindow::canAddDb(QFontDatabase database, QString fileName)
{
    if (canOpenFontFile(fileName))
    {
        int result = database.addApplicationFont(fileName);
        if (result == -1)
        {
            QMessageBox::information(
                this, TR("Unable to install font file:\n"),
                    "fileName="+fileName);
            return false;
        }
    }
    return true;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//    QString path = QCoreApplication::applicationDirPath() + "/";
//    QString fileName = path +"org.ttf";

    QString path = ":/fonts/";
    QString fileName = path + "org.ttf";

    QFontDatabase database;

    if(canAddDb(database, fileName))
    {
        QFont f = database.font("myfont","Normal",30);
//        f.setPointSize(12);
        f.setFixedPitch(true);
        f.setPixelSize(12);
        ui->label01->setFont(f);
        ui->label02->setFont(f);
        ui->label03->setFont(f);
    }
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Shift-JIS"));
    //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Shift-JIS"));

    QString str01 = path;
    QString str02 = "!#$%& 0123456789 abcdefghijklmnopqrstuvwxyz あいうえお 美しいフォント";
    QString str03 = "ヤマト、最大180円値上げ=基本運賃、27年ぶり";

    QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");

    QByteArray ba02 = codec->fromUnicode(str02);
    QByteArray ba03 = codec->fromUnicode(str03);

    ui->label01->setText(str01);
    ui->label02->setText(ba02);
    ui->label03->setText(ba03);

    QString str11 = path;
    ui->label11->setText(str11);
    ui->label12->setText(TR("!#$%& 0123456789 abcdefghijklmnopqrstuvwxyz あいうえお 美しいフォント"));
    ui->label13->setText(TR("ヤマト、最大180円値上げ=基本運賃、27年ぶり"));
 }

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