MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - 文字コードのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - 文字コード
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Qtでは、標準の文字コードはUTF-16である。<br> <br> 例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの文字コードはUTF-8であるため、文字コードの変換が必要となる。<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> // Shift-JISからUTF-8へデコードする場合 QByteArray SJISdata = "あいうえお"; QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); QString str = codec->toUnicode(SJISdata); // UTF-8からShift-JISへエンコードする場合 QString str = "あいうえお"; QByteArray data = str.toUtf8(); // 文字列をバイト列へ変換 QTextCodec *codec; // エンコードオブジェクト codec = QTextCodec::codecForName("Shift-JIS"); encodedPostData = codec->fromUnicode(data); </syntaxhighlight> <br> Qt 6では、以下に示すように書き換えることができる。<br> <syntaxhighlight lang="c++"> // Qt 6の場合 #include <QStringConverter> // Shift-JISからUTF-8へデコードする場合 QByteArray SJISdata = "あいうえお"; QStringDecoder decoder("Shift-JIS"); QString str = decoder(SJISdata); // UTF-8からShift-JISへエンコードする場合 QString str = "あいうえお"; QByteArray data = str.toUtf8(); // 文字列をバイト列へ変換 QStringEncoder encoder("Shift-JIS"); QString encodeStr = encoder(data); </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> == UTF-8から他の文字コードへの変換 == ==== QString::fromLocal8Bit() ==== Visual StudioとQtを連携する場合、文字列リテラルはソースコードのファイルの文字コードに関わらず、<br> ロケールの文字コード(WindowsならShift-JIS)に変換してコンパイルされるため、<br> 現在のロケールに合わせた文字コードで変換するQString::fromLocal8Bit()を使用する。<br> <syntaxhighlight lang="c++"> QString strU8 = QString::fromLocal8Bit("テスト"); ui->label->setText(strU8); </syntaxhighlight> <br> ==== QString::fromUtf8() ==== Visual Studio 2015以降とQtを連携する場合、Unicode文字列リテラルに対応しているため、<br> 接頭辞u8を付加することで、UTF-8のまま(ロケールの文字コードに変換されることなく)コンパイルすることができる。<br> <syntaxhighlight lang="c++"> QString strU8 = QString::fromUtf8(u8"テスト"); ui->label->setText(strU8); </syntaxhighlight> <br> ==== pragmaの指定 ==== Visual Studio 2013以前とQtを連携する場合、pragmaを指定することで、文字列リテラルをUTF-8に変換することができる。<br> <syntaxhighlight lang="c++"> #pragma execution_character_set("utf-8") </syntaxhighlight> <br> ==== その他の方法 ==== 以下のように、クラスに静的メソッドを定義して使用する方法でもよい。<br> <syntaxhighlight lang="c++"> std::string MainWindow::UTF16_to_UTF8(const QString &src) { return src.toUtf8().toStdString(); } </syntaxhighlight> <br><br> == UTF-16から他の文字コードへの変換 == ==== 現在のロケールへの変換 ==== UTF-16から現在のロケール(Windowsの場合はShift-JIS)へ変換する。<br> <syntaxhighlight lang="c++"> std::string MainWindow::UTF16_to_Locale(const QString &src) { return src.toLocal8Bit().toStdString(); } </syntaxhighlight> <br> ==== Shift-JISへの変換 ==== UTF-16からShift-JISへ変換する。<br> <syntaxhighlight lang="c++"> std::string MainWindow::UTF16_to_SJIS(const QString &src) { QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); QByteArray encoded = codec->fromUnicode(src); return encoded.toStdString(); } </syntaxhighlight> <br> ==== EUC-JPへの変換 ==== UTF-16からEUC-JPへ変換する。<br> <syntaxhighlight lang="c++"> std::string MainWindow::UTF16_to_EUC(const QString &src) { QTextCodec *codec = QTextCodec::codecForName("EUC-JP"); QByteArray encoded = codec->fromUnicode(src); return encoded.toStdString(); } </syntaxhighlight> <br><br> == Shift-JISからUTF-16への変換 == Shift-JISからUTF-16へ変換する。<br> <syntaxhighlight lang="c++"> QString MainWindow::SJIS_to_UTF16(const std::string &src) { QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); return codec->toUnicode(src.c_str()); } </syntaxhighlight> <br><br> == EUC-JPからUTF-16への変換 == EUC-JPからUTF-16へ変換する。<br> <syntaxhighlight lang="c++"> QString MainWindow::EUC_to_UTF16(const std::string &src) { QTextCodec *codec = QTextCodec::codecForName("EUC-JP"); return codec->toUnicode(src.c_str()); } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - 文字コード
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse