「Qtの基礎 - 文字コード」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == Qtでは、標準の文字コードはUTF-16である。<br> <br> 例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの…」)
 
4行目: 4行目:
例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの文字コードはUTF-8であるため、文字コードの変換が必要となる。<br>
例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの文字コードはUTF-8であるため、文字コードの変換が必要となる。<br>
(変換しない場合は文字化けする)<br>
(変換しない場合は文字化けする)<br>
<br><br>
== QTextCodecクラスについて ==
==== Qt 5 / Qt 6の違い ====
Qt 6では、<code>QTextCodec</code>クラスの使用方法が変更された。<br>
<u>Qt 6では<code>QTextCodec</code>クラスのインクルードはサポートされておらず、代わりに文字エンコーディングの処理が<code>QStringConverter</code>クラスに移行された。</u><br>
これにより、より柔軟で効率的な文字列変換が可能になった。<br>
<br>
* Qt 6の場合
<syntaxhighlight lang="c++">
#include <QStringConverter>
</syntaxhighlight>
<br>
例えば、Qt 5において、以下に示すようなコードがあるとする。<br>
<syntaxhighlight lang="c++">
// Qt 5
#include <QTextCodec>
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString str = codec->toUnicode(byteArray);
</syntaxhighlight>
<br>
Qt 6では、以下に示すように書き換えることができる。<br>
<syntaxhighlight lang="c++">
// Qt 6
#include <QStringConverter>
QStringDecoder decoder(QStringDecoder::Utf8);
QString str = decoder(byteArray);
</syntaxhighlight>
<br>
この変更は、QtのコアAPIをより現代的で効率的なものにするための一環である。<br>
新しいAPIは、以前のものと比較してより柔軟性が高く、パフォーマンスも向上している。<br>
<br>
==== Qt 6でQTextCodecクラスを使用する場合 ====
Qt 6において、以前の<code>QTextCodec</code>クラスを使用することもできる。<br>
<br>
* CMakeを使用する場合
<syntaxhighlight lang="cmake">
find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)
</syntaxhighlight>
<br>
* QMakeを使用する場合
<syntaxhighlight lang="make">
QT += core5compat
</syntaxhighlight>
<br>
ソースコードファイルにおいて、<code>QTextCodec</code>クラスをインクルードする。<br>
<syntaxhighlight lang="c++">
#include <QTextCodec>
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString str = codec->toUnicode(byteArray);
</syntaxhighlight>
<br><br>
<br><br>



2024年7月26日 (金) 22:45時点における版

概要

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

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


QTextCodecクラスについて

Qt 5 / Qt 6の違い

Qt 6では、QTextCodecクラスの使用方法が変更された。
Qt 6ではQTextCodecクラスのインクルードはサポートされておらず、代わりに文字エンコーディングの処理がQStringConverterクラスに移行された。
これにより、より柔軟で効率的な文字列変換が可能になった。

  • Qt 6の場合
 #include <QStringConverter>


例えば、Qt 5において、以下に示すようなコードがあるとする。

 // Qt 5
 
 #include <QTextCodec>
 
 QTextCodec *codec = QTextCodec::codecForName("UTF-8");
 QString str = codec->toUnicode(byteArray);


Qt 6では、以下に示すように書き換えることができる。

 // Qt 6
 
 #include <QStringConverter>
 
 QStringDecoder decoder(QStringDecoder::Utf8);
 QString str = decoder(byteArray);


この変更は、QtのコアAPIをより現代的で効率的なものにするための一環である。
新しいAPIは、以前のものと比較してより柔軟性が高く、パフォーマンスも向上している。

Qt 6でQTextCodecクラスを使用する場合

Qt 6において、以前のQTextCodecクラスを使用することもできる。

  • CMakeを使用する場合
 find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
 
 target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)


  • QMakeを使用する場合
 QT += core5compat


ソースコードファイルにおいて、QTextCodecクラスをインクルードする。

 #include <QTextCodec>
 
 QTextCodec *codec = QTextCodec::codecForName("UTF-8");
 QString str = codec->toUnicode(byteArray);



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());
 }