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

ナビゲーションに移動 検索に移動
4行目: 4行目:
例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの文字コードはUTF-8であるため、文字コードの変換が必要となる。<br>
例えば、Visual StudioとQtを連携する場合、ソースコードのファイルの文字コードはUTF-8であるため、文字コードの変換が必要となる。<br>
(変換しない場合は文字化けする)<br>
(変換しない場合は文字化けする)<br>
<br><br>
== QStringの内部表現 ==
QStringの内部表現は、プラットフォームに関係なく常にUTF-16で文字列を保持する。<br>
<br>
* 内部表現
*: <syntaxhighlight lang="c++">
QString str = "こんにちは";  // 内部的にはUTF-16として保存される
</syntaxhighlight>
* 確認方法
*: <syntaxhighlight lang="c++">
QString str = "こんにちは";
QByteArray utf16 = str.toUtf16();  // 内部表現のUTF-16を直接取得
QByteArray utf8 = str.toUtf8();    // UTF-8に変換
qDebug() << "UTF-16 size:" << utf16.size();  // UTF-16のバイト数
qDebug() << "UTF-8 size:" << utf8.size();    // UTF-8のバイト数
</syntaxhighlight>
<br>
* データの流れ
*: <syntaxhighlight lang="c++">
// 入力 (UTF-8) -> QString (UTF-16) -> 出力 (任意の文字エンコーディング)
QByteArray utf8_input = "こんにちは";          // UTF-8データ
QString str = QString::fromUtf8(utf8_input);  // 内部でUTF-16に変換
QByteArray output = str.toUtf8();            // 必要に応じてUTF-8に変換して出力
<br>
QStringは常にUTF-16で保持する仕様であるため、UTF-8として保持する場合はQByteArrayを使用する必要がある。<br>
<br>
<u>※注意</u><br>
<u>QByteArrayは、文字単位の操作が難しい。</u><br>
<u>また、Unicode正規化等の操作ができない。</u><br>
<br>
<u>QByteArrayは、文字列長の取得が正確でない可能性がある。</u><br>
<br>
QFile::writeメソッドは、QByteArrayまたはconst char*を期待するため、QStringを直接指定する場合はエラーになる。<br>
QStringからの暗黙の型変換は許可されていない。<br>
<br>
QTextStreamを使用する場合は、エンコーディングを明示的に制御できる。<br>
バイナリモードで書き込む場合は、エンコーディングの制御が完全に開発者の責任になる。<br>
<syntaxhighlight lang="c++">
QFile file("test.txt");
QString str = "こんにちは";
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    // 方法 1 : QTextStreamを使用 (推奨)
    QTextStream out(&file);
    out.setEncoding(QStringConverter::Utf8);  // UTF-8を指定
    out << str;
    // 方法 2 : 直接バイト列として書き込む
    // file.write(str.toUtf8());
    file.close();
}
</syntaxhighlight>
<br>
選択の基準<br>
* QStringを使用する場合
*: テキスト処理や文字列操作が必要な場合
*: Unicode関連の操作が必要な場合
*: クロスプラットフォームの互換性が必要な場合
*: アプリケーション内部の処理では、QString (UTF-16) を使用する。
*: <br>
* QByteArrayを使用する場合
*: バイナリデータとして扱う場合
*: エンコーディングを維持したまま保存、あるいは、送信する場合
*: メモリ使用量を最小限にする場合
*: 外部とのやり取り (ファイルI/O、ネットワーク通信等) では、必要に応じてQByteArray (UTF-8) を使用する。
<br><br>
<br><br>


案内メニュー