「Qtの基礎 - 文字コード」の版間の差分
(ページの作成:「== 概要 == 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());
}