Qtの基礎 - 文字コード

提供:MochiuWiki : SUSE, EC, PCB
2021年2月15日 (月) 12:06時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == Qtでは、標準の文字コードはUTF-16である。<br> <br> 例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

Qtでは、標準の文字コードはUTF-16である。

例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの文字コードはUTF-8であるため、文字コードの変換が必要となる。
(変換しない場合は文字化けする)


UTF-8から他の文字コードへの変換

QString::fromLocal8Bit()

Visual StudioとQtを連携する場合、文字列リテラルはソースコードのファイルの文字コードに関わらず、
ロケールの文字コード(WindowsならShift-JIS)に変換してコンパイルされるため、
現在のロケールに合わせた文字コードで変換するQString::fromLocal8Bit()を使用する。

 QString strU8 = QString::fromLocal8Bit("テスト");
 ui->label->setText(strU8);


QString::fromUtf8()

Visual Studio 2015以降とQtを連携する場合、Unicode文字列リテラルに対応しているため、
接頭辞u8を付加することで、UTF-8のまま(ロケールの文字コードに変換されることなく)コンパイルすることができる。

 QString strU8 = QString::fromUtf8(u8"テスト");
 ui->label->setText(strU8);


pragmaの指定

Visual Studio 2013以前とQtを連携する場合、pragmaを指定することで、文字列リテラルをUTF-8に変換することができる。

 #pragma execution_character_set("utf-8")


その他の方法

以下のように、クラスに静的メソッドを定義して使用する方法でもよい。

 std::string MainWindow::UTF16_to_UTF8(const QString &src)
 {
    return src.toUtf8().toStdString();
 }



UTF-16から他の文字コードへの変換

現在のロケールへの変換

UTF-16から現在のロケール(Windowsの場合はShift-JIS)へ変換する。

 std::string MainWindow::UTF16_to_Locale(const QString &src)
 {
    return src.toLocal8Bit().toStdString();
 }


Shift-JISへの変換

UTF-16からShift-JISへ変換する。

 std::string MainWindow::UTF16_to_SJIS(const QString &src)
 {
    QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
    QByteArray encoded = codec->fromUnicode(src);
 
    return encoded.toStdString();
 }


EUC-JPへの変換

UTF-16からEUC-JPへ変換する。

 std::string MainWindow::UTF16_to_EUC(const QString &src)
 {
    QTextCodec *codec = QTextCodec::codecForName("EUC-JP");
    QByteArray encoded = codec->fromUnicode(src);
 
    return encoded.toStdString();
 }



Shift-JISからUTF-16への変換

Shift-JISからUTF-16へ変換する。

 QString MainWindow::SJIS_to_UTF16(const std::string &src)
 {
    QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");
 
    return codec->toUnicode(src.c_str());
 }



EUC-JPからUTF-16への変換

EUC-JPからUTF-16へ変換する。

 QString MainWindow::EUC_to_UTF16(const std::string &src)
 {
    QTextCodec *codec = QTextCodec::codecForName("EUC-JP");
 
    return codec->toUnicode(src.c_str());
 }