QTextStream::setGenerateByteOrderMark()
QTextStream::setGenerateByteOrderMark() とは
QTextStream
クラスは、ファイルやデバイスに対してテキストの読み書きを行うための便利なインターフェースを提供します。テキストデータのエンコーディング(文字コード)を扱う際に、setGenerateByteOrderMark()
関数が重要になります。
この関数は、引数に bool
値を受け取ります。
setGenerateByteOrderMark(false)
: テキストファイルに書き込む際、BOMを挿入しないように設定します(デフォルトの動作)。setGenerateByteOrderMark(true)
: テキストファイルに書き込む際、ファイルの先頭にBOMを挿入するように設定します。
バイトオーダーマーク (BOM) とは
BOM (Byte Order Mark) は、Unicode テキストファイルの先頭に付けられる特別なバイト列です。主に以下の目的で使用されます。
- エンコーディングの識別: ファイルがどのUnicodeエンコーディング(例: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE)で符号化されているかを示すヒントとして機能します。
- バイトオーダーの識別: UTF-16 や UTF-32 のように、1文字が複数のバイトで表現されるエンコーディングの場合、そのバイトが「リトルエンディアン (Little Endian)」か「ビッグエンディアン (Big Endian)」かを示すために使用されます。
エンコーディング | BOM (16進数) |
---|---|
UTF-8 | EF BB BF |
UTF-16 Big Endian | FE FF |
UTF-16 Little Endian | FF FE |
UTF-32 Big Endian | 00 00 FE FF |
UTF-32 Little Endian | FF FE 00 00 |
setGenerateByteOrderMark() の使用場面
- 相互運用性: 異なるオペレーティングシステムやアプリケーション間でファイルを共有する場合、BOM を含めることでエンコーディングの問題を減らすことができます。
- Unicode テキストファイルの作成: 特に UTF-16 などの Unicode エンコーディングでファイルを保存する場合、他のアプリケーションがそのファイルを正しく読み込めるように、BOM を含めることが推奨されます。多くのテキストエディタやプログラムは、BOM を見てエンコーディングを自動判別します。
注意点:
- デフォルトの動作:
QTextStream
はデフォルトでは BOM を生成しません。したがって、明示的に BOM を含めたい場合はsetGenerateByteOrderMark(true)
を呼び出す必要があります。 - UTF-8 の場合: UTF-8 に BOM を含めるかどうかは議論の余地があります。BOM は UTF-8 では必須ではありませんし、一部のシステム(特にLinux系のスクリプトなど)では、BOM がファイルの先頭にあることで問題を引き起こすことがあります。そのため、UTF-8 で保存する場合は、BOM を生成しない (
setGenerateByteOrderMark(false)
) ことが一般的です。
#include <QFile>
#include <QTextStream>
#include <QDebug>
int main() {
// BOM なしでUTF-8でファイルを書き込む例 (デフォルトの動作)
QFile file1("output_no_bom.txt");
if (file1.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file1);
out.setCodec("UTF-8"); // UTF-8 を明示的に設定
out << "こんにちは、世界! (BOMなし UTF-8)";
file1.close();
qDebug() << "output_no_bom.txt を作成しました。";
}
// BOM ありでUTF-16でファイルを書き込む例
QFile file2("output_with_bom_utf16.txt");
if (file2.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file2);
out.setCodec("UTF-16"); // UTF-16 を設定
out.setGenerateByteOrderMark(true); // BOM を生成する
out << "こんにちは、世界! (BOMあり UTF-16)";
file2.close();
qDebug() << "output_with_bom_utf16.txt を作成しました。";
}
// BOM ありでUTF-8でファイルを書き込む例 (一部の環境で推奨されない場合がある)
QFile file3("output_with_bom_utf8.txt");
if (file3.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file3);
out.setCodec("UTF-8"); // UTF-8 を設定
out.setGenerateByteOrderMark(true); // BOM を生成する
out << "こんにちは、世界! (BOMあり UTF-8)";
file3.close();
qDebug() << "output_with_bom_utf8.txt を作成しました。";
}
return 0;
}
このコードを実行すると、3つのテキストファイルが生成されます。それぞれのファイルの内容をバイナリエディタなどで確認すると、BOMの有無を確認できます。
QTextStream::setGenerateByteOrderMark()
に関連する一般的なエラーとトラブルシューティング
ファイルの文字化け (Mojibake)
問題
生成されたテキストファイルを他のエディタやシステムで開くと、文字が正しく表示されず、文字化けしてしまう。
原因
- BOM なしでのエンコーディングの誤解釈
setGenerateByteOrderMark(false)
でBOMを書き込まなかった場合、読み込み側のアプリケーションがファイルのエンコーディングを正しく自動検出できないために文字化けが発生することがあります。 - UTF-8 と BOM
特にUTF-8の場合、BOMはオプションであり、一部のシステム(特にLinuxのシェルスクリプトや一部のコンパイラ)ではBOMを通常のデータの一部と見なしてしまい、問題を引き起こすことがあります。 - エンコーディングの不一致
setGenerateByteOrderMark(true)
を使用してBOMを書き込んだにもかかわらず、読み込み側のアプリケーションがそのBOMを正しく解釈できない、あるいはBOMのないファイルとして扱おうとしている。
トラブルシューティング
- ファイル内容の確認
バイナリエディタ(例: HxD, Sublime TextのHex Editorプラグイン)で生成されたファイルの先頭数バイトを確認し、意図したBOMが書き込まれているか、あるいは書き込まれていないかを確認します。 - BOM の有無とエンコーディングの統一
- 書き込み側
QTextStream::setCodec()
で明示的にエンコーディングを設定し、setGenerateByteOrderMark()
の設定をそれに合わせて調整します。- UTF-16 (LE/BE) や UTF-32 (LE/BE) の場合は、通常
setGenerateByteOrderMark(true)
を設定してBOMを書き込むことを強く推奨します。これにより、読み込み側がエンコーディングとバイトオーダーを自動的に識別しやすくなります。 - UTF-8 の場合、BOMは必須ではありません。多くのWebサーバーやLinuxベースのシステムでは、UTF-8にBOMがないことを前提としています。もし互換性の問題が発生する場合は、
setGenerateByteOrderMark(false)
(デフォルト)にしてBOMを書き込まないようにすることを検討してください。
- UTF-16 (LE/BE) や UTF-32 (LE/BE) の場合は、通常
- 読み込み側
ファイルを読み込む際にも、QTextStream::setCodec()
で適切なエンコーディングを明示的に設定することが重要です。QTextStream
はデフォルトでBOMを自動検出しますが、確実に動作させるためにはコード設定が必要です。
- 書き込み側
BOM が期待通りに書き込まれない
問題
setGenerateByteOrderMark(true)
を呼び出したにもかかわらず、ファイルにBOMが書き込まれていないように見える。
原因
- flush() やファイルのクローズ忘れ
QTextStream
は内部バッファを使用しているため、書き込み操作を行った後、flush()
を呼び出すか、関連するQFile
オブジェクトをクローズしないと、データが実際にファイルに書き込まれないことがあります。BOMもこのバッファリングの影響を受けます。 - QTextStream の前にデータが書き込まれた
QFile
などを使ってファイルを開き、QTextStream
を関連付ける前に、何らかのデータが既にファイルに書き込まれている場合、BOMはファイルの先頭ではなく、そのデータの後に書き込まれてしまいます。BOMはファイルの先頭に挿入されるべきものです。 - 非UTFエンコーディングの使用
setGenerateByteOrderMark()
は、UTF系のエンコーディング(UTF-8, UTF-16, UTF-32)でのみ効果を発揮します。setCodec("Shift-JIS")
やsetCodec("Windows-1252")
のように、BOMをサポートしないエンコーディングを設定している場合、setGenerateByteOrderMark(true)
を呼び出してもBOMは書き込まれません。
トラブルシューティング
- flush() とファイルのクローズ
データの書き込みが完了したら、必ずQTextStream::flush()
を呼び出すか、関連するQFile
オブジェクトをclose()
するようにします。QFile
をQIODevice::WriteOnly
やQIODevice::Append
で開いた場合、自動的にクローズされない限り、バッファリングされたデータがファイルに書き込まれないことがあります。 - 書き込み順序の確認
QTextStream
を作成し、setCodec()
とsetGenerateByteOrderMark(true)
を設定してから、初めてテキストデータを書き込むようにします。 - エンコーディングの確認
QTextStream::codec()
を呼び出して、現在設定されているエンコーディングがUTF系であることを確認します。
BOM の二重書き込み (稀なケース)
問題
ファイルにBOMが二重に書き込まれてしまう。
原因
非常に稀なケースですが、例えばファイルを一度BOM付きで書き込み、その後別のQTextStream
インスタンスや別の方法で、既にBOMが存在するファイルの先頭にさらにBOM付きでデータを追記しようとした場合などに発生する可能性があります。
- ファイルを追記モード (
QIODevice::Append
) で開く場合は、BOMが既に存在しないことを確認するか、BOMの生成を無効にする (setGenerateByteOrderMark(false)
) ことを検討します。 - ファイルを書き込む際は、常に新しいファイルとして作成するか、既存のファイルを上書きするように
QIODevice::Truncate
フラグを使用することを検討します。
- シンプルなコードでの切り分け
問題が発生した場合は、BOMの有無とエンコーディング設定だけを試す、非常にシンプルなコードスニペットを作成し、問題を切り分けて特定します。 - テスト環境での確認
異なるOS(Windows, macOS, Linux)や異なるテキストエディタ、他のアプリケーションで生成したファイルを実際に開いてみて、正しく表示されるか確認することが重要です。 - 明示的なエンコーディング設定
文字化けの問題を避けるためにも、ファイルの読み書きを行う際には常にQTextStream::setCodec()
で明示的にエンコーディングを設定することを強く推奨します。システムのデフォルトロケールに依存すると、環境によって動作が変わる可能性があります。
QTextStream::setGenerateByteOrderMark() のプログラミング例
ここでは、Qt を使用してテキストファイルを書き込む際に、BOM (Byte Order Mark) を生成するかどうかを制御する例をいくつか示します。
準備: 必要なモジュールとヘッダー
Qt プロジェクトを作成し、.pro
ファイルに QT += core
を追加してください。
// main.cpp
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDebug> // デバッグ出力用
例1: UTF-8 で BOM なし (デフォルト動作)
これは最も一般的なケースで、setGenerateByteOrderMark()
を明示的に呼び出さない場合、BOMは書き込まれません。UTF-8 の場合、BOMなしが推奨されることが多いです。
// Example 1: UTF-8 with no BOM (default behavior)
void writeUtf8NoBom() {
QFile file("utf8_no_bom.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-8"); // UTF-8 エンコーディングを設定
// setGenerateByteOrderMark(false) はデフォルトなので不要
out << "こんにちは、世界! (UTF-8, BOMなし)\n";
out << "第二行目。\n";
file.close();
qDebug() << "ファイル 'utf8_no_bom.txt' を作成しました (UTF-8, BOMなし)。";
} else {
qWarning() << "ファイル 'utf8_no_bom.txt' を開けませんでした。";
}
}
出力されるファイル (utf8_no_bom.txt) のバイナリ表現 (抜粋)
E3 81 93 E3 82 93 E3 81 AB E3 81 A1 E3 81 AF E3 80 81 E4 B8 96 E7 95 8C EF BC 81 (...)
ファイルの先頭に EF BB BF
(UTF-8 BOM) はありません。
例2: UTF-8 で BOM あり
UTF-8 にBOMを含めることは必須ではありませんが、一部のWindowsアプリケーションなどはBOMによってUTF-8と認識する場合があるため、互換性のために使用されることがあります。
// Example 2: UTF-8 with BOM
void writeUtf8WithBom() {
QFile file("utf8_with_bom.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-8");
out.setGenerateByteOrderMark(true); // BOM を生成する
out << "こんにちは、世界! (UTF-8, BOMあり)\n";
out << "第二行目。\n";
file.close();
qDebug() << "ファイル 'utf8_with_bom.txt' を作成しました (UTF-8, BOMあり)。";
} else {
qWarning() << "ファイル 'utf8_with_bom.txt' を開けませんでした。";
}
}
出力されるファイル (utf8_with_bom.txt) のバイナリ表現 (抜粋)
EF BB BF E3 81 93 E3 82 93 E3 81 AB E3 81 A1 E3 81 AF E3 80 81 E4 B8 96 E7 95 8C EF BC 81 (...)
ファイルの先頭に EF BB BF
(UTF-8 BOM) があります。
例3: UTF-16LE (Little Endian) で BOM あり
UTF-16 や UTF-32 の場合、BOMはエンコーディングとバイトオーダーを区別するために非常に重要です。特にWindows環境では、UTF-16LE にBOMを含めることが一般的です。
// Example 3: UTF-16LE with BOM
void writeUtf16LeWithBom() {
QFile file("utf16le_with_bom.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-16LE"); // UTF-16 Little Endian を設定
out.setGenerateByteOrderMark(true); // BOM を生成する (強く推奨)
out << "こんにちは、世界! (UTF-16LE, BOMあり)\n";
out << "第二行目。\n";
file.close();
qDebug() << "ファイル 'utf16le_with_bom.txt' を作成しました (UTF-16LE, BOMあり)。";
} else {
qWarning() << "ファイル 'utf16le_with_bom.txt' を開けませんでした。";
}
}
出力されるファイル (utf16le_with_bom.txt) のバイナリ表現 (抜粋)
FF FE 13 30 93 30 AB 30 C1 30 AF 30 BB 30 C0 30 B5 30 4C (...)
ファイルの先頭に FF FE
(UTF-16LE BOM) があります。
例4: UTF-16BE (Big Endian) で BOM あり
こちらもUTF-16のケースで、ビッグエンディアンを指定した場合の例です。
// Example 4: UTF-16BE with BOM
void writeUtf16BeWithBom() {
QFile file("utf16be_with_bom.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-16BE"); // UTF-16 Big Endian を設定
out.setGenerateByteOrderMark(true); // BOM を生成する (強く推奨)
out << "こんにちは、世界! (UTF-16BE, BOMあり)\n";
out << "第二行目。\n";
file.close();
qDebug() << "ファイル 'utf16be_with_bom.txt' を作成しました (UTF-16BE, BOMあり)。";
} else {
qWarning() << "ファイル 'utf16be_with_bom.txt' を開けませんでした。";
}
}
出力されるファイル (utf16be_with_bom.txt) のバイナリ表現 (抜粋)
FE FF 30 13 30 93 30 AB 30 C1 30 ク 30 ス 30 テ 30 ク 30 ス (...)
ファイルの先頭に FE FF
(UTF-16BE BOM) があります。
例5: BOM の有無が効果を発揮しないエンコーディング
setGenerateByteOrderMark()
は、BOMをサポートするUTF系のエンコーディングでのみ意味があります。それ以外のエンコーディング(例: Shift-JIS)では、この設定をしてもBOMは書き込まれません。
// Example 5: Non-UTF encoding (BOM has no effect)
void writeShiftJIS() {
QFile file("shiftjis_no_bom.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
// BOMをサポートしないエンコーディング
out.setCodec("Shift-JIS");
// この設定は無視されます
out.setGenerateByteOrderMark(true);
out << "こんにちは、世界! (Shift-JIS)\n";
file.close();
qDebug() << "ファイル 'shiftjis_no_bom.txt' を作成しました (Shift-JIS)。";
} else {
qWarning() << "ファイル 'shiftjis_no_bom.txt' を開けませんでした。";
}
}
出力されるファイル (shiftjis_no_bom.txt) のバイナリ表現 (抜粋)
82 B1 82 F1 82 C9 82 BF 82 CD A1 A2 90 A2 8AC D8 EF BA B9 (...)
ファイルの先頭にBOMは書き込まれません。
全体の main
関数
上記の関数を呼び出す main
関数です。
// main.cpp の main 関数
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
writeUtf8NoBom();
writeUtf8WithBom();
writeUtf16LeWithBom();
writeUtf16BeWithBom();
writeShiftJIS();
// 実際のファイルを確認するために、アプリケーションをすぐに終了させない
qDebug() << "\n全てのファイルが作成されました。";
qDebug() << "これらのファイルをテキストエディタやバイナリエディタで開いて、BOMの有無を確認してください。";
return 0; // すぐに終了
// return a.exec(); // イベントループが必要な場合はこちらを有効にする
}
- バイナリエディタ
HxD (Windows), Hex Fiend (macOS), または多くのプログラミングエディタのHex Editorプラグインなどを使用して、ファイルの先頭数バイトを直接確認すると、BOM (例:EF BB BF
for UTF-8 BOM,FF FE
for UTF-16LE BOM) が存在するかどうかを確実に検証できます。 - テキストエディタ
Visual Studio Code, Sublime Text, Notepad++ など多くのテキストエディタは、BOMの有無によってエンコーディングを自動判別しようとします。これらのエディタで各ファイルを開き、文字化けせずに正しく表示されるか確認してください。
QTextStream::setGenerateByteOrderMark()
の代替方法
主に以下の2つのアプローチが考えられます。
QTextStream
を使わず、生バイト列として BOM を手動で書き込む- BOM を手動で追加した
QByteArray
をQTextStream
に渡す
これらの方法は、より低レベルなファイル操作を必要とする場合や、特定のBOMの生成ルールを厳密に制御したい場合に役立ちます。
QTextStream を使わず、生バイト列として BOM を手動で書き込む
この方法は、QFile::write()
を直接使用して、BOMのバイト列をファイルの先頭に書き込み、その後に実際のテキストデータを書き込むものです。テキストデータのエンコーディング変換は QString::toUtf8()
, QString::toUcs2()
などを使って手動で行う必要があります。
利点
QTextStream
が対応していない特殊なエンコーディングや、BOM以外のカスタムヘッダーなどを書き込む必要がある場合に柔軟に対応できる。- BOMの有無やエンコーディングを完全に手動で制御できる。
欠点
- エラーハンドリングも手動で行う必要がある。
- エンコーディング変換、BOMのバイト列の管理、改行コードの処理など、
QTextStream
が自動で行ってくれる処理をすべて手動で行う必要があるため、コードが複雑になりやすい。
例: UTF-8 (BOMあり) の手動書き込み
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QDebug>
void writeUtf8WithBomManually(const QString& filename, const QString& content) {
QFile file(filename);
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
// UTF-8 BOM のバイト列
QByteArray bomBytes = QByteArray::fromHex("EFBBBF"); // EF BB BF
// BOM を書き込む
if (file.write(bomBytes) == -1) {
qWarning() << "BOM の書き込みに失敗しました:" << file.errorString();
file.close();
return;
}
// QString を UTF-8 バイト列に変換
QByteArray encodedContent = content.toUtf8();
// データを書き込む
if (file.write(encodedContent) == -1) {
qWarning() << "コンテンツの書き込みに失敗しました:" << file.errorString();
}
file.close();
qDebug() << "ファイル '" << filename << "' を手動で作成しました (UTF-8, BOMあり)。";
} else {
qWarning() << "ファイル '" << filename << "' を開けませんでした:" << file.errorString();
}
}
// メイン関数 (例として)
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QString text = "こんにちは、手動書き込みの世界!\nBOMを手動で追加しています。";
writeUtf8WithBomManually("manual_utf8_bom.txt", text);
return 0;
}
例: UTF-16LE (BOMあり) の手動書き込み
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QTextCodec> // UTF-16LE 変換に必要
#include <QDebug>
void writeUtf16LeWithBomManually(const QString& filename, const QString& content) {
QFile file(filename);
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
// UTF-16LE BOM のバイト列
QByteArray bomBytes = QByteArray::fromHex("FFFE"); // FF FE
// BOM を書き込む
if (file.write(bomBytes) == -1) {
qWarning() << "BOM の書き込みに失敗しました:" << file.errorString();
file.close();
return;
}
// QString を UTF-16LE バイト列に変換
// toUcs2() はシステムのエンディアンに依存するため、
// 明示的にQTextCodecを使用するか、QCharの配列をQByteArrayに変換する
QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
if (!codec) {
qWarning() << "UTF-16LE コーデックが見つかりません。";
file.close();
return;
}
QByteArray encodedContent = codec->fromUnicode(content);
// データを書き込む
if (file.write(encodedContent) == -1) {
qWarning() << "コンテンツの書き込みに失敗しました:" << file.errorString();
}
file.close();
qDebug() << "ファイル '" << filename << "' を手動で作成しました (UTF-16LE, BOMあり)。";
} else {
qWarning() << "ファイル '" << filename << "' を開けませんでした:" << file.errorString();
}
}
// メイン関数 (例として)
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QString text = "こんにちは、手動書き込みの世界!\nBOMを手動で追加しています。";
writeUtf16LeWithBomManually("manual_utf16le_bom.txt", text);
return 0;
}
BOM を手動で追加した QByteArray を QTextStream に渡す
この方法は、一度 QString
を目的のエンコーディングの QByteArray
に変換し、その QByteArray
の先頭にBOMのバイト列を手動で追加します。その後、その QByteArray
を QFile::write()
を使って書き込みます。この場合、QTextStream
はテキストのエンコーディング変換には使用されず、純粋なバイトストリームとしてファイルに書き込むことになります。
利点
QTextStream::setGenerateByteOrderMark()
が効かないケース(例: 他のエンコーディング)でも、BOMに似たカスタムヘッダーを挿入できる。QTextStream
の一部の利点 (例: データの整形) を活用しつつ、BOMの挿入をより細かく制御できる。
欠点
- 改行コードの正規化なども手動で行う必要がある。
- テキストデータのエンコーディング変換を事前に
QString
メソッドやQTextCodec
で行う必要がある。
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QDebug>
void writeUtf8WithBomViaByteArray(const QString& filename, const QString& content) {
QFile file(filename);
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
// UTF-8 BOM のバイト列
QByteArray bomBytes = QByteArray::fromHex("EFBBBF"); // EF BB BF
// QString を UTF-8 バイト列に変換
QByteArray encodedContent = content.toUtf8();
// BOM を先頭に追加
QByteArray finalData = bomBytes + encodedContent;
// データを書き込む
if (file.write(finalData) == -1) {
qWarning() << "データ書き込みに失敗しました:" << file.errorString();
}
file.close();
qDebug() << "ファイル '" << filename << "' を QByteArray 経由で作成しました (UTF-8, BOMあり)。";
} else {
qWarning() << "ファイル '" << filename << "' を開けませんでした:" << file.errorString();
}
}
// メイン関数 (例として)
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QString text = "こんにちは、QByteArray 経由の世界!\nBOMを結合しています。";
writeUtf8WithBomViaByteArray("bytearray_utf8_bom.txt", text);
return 0;
}
-
上記のような代替方法は、特定の、より高度な制御が必要な場合にのみ検討するべきです。例えば、以下のような状況です。
QTextStream
がサポートしていない、非常に特殊なエンコーディングを扱う場合。- ファイルの先頭にBOM以外のカスタムヘッダーを厳密なバイナリ形式で書き込む必要がある場合。
- 既存のバイナリファイルに特定の位置からデータを追加する必要がある場合。
- パフォーマンスが非常に重要で、
QTextStream
のオーバーヘッドを避けたい場合(ただし、これは通常、ごくわずかな差です)。
-
ほとんどのケースでは、
QTextStream::setGenerateByteOrderMark(true)
を使用するのが最も簡単で推奨される方法です。 QtがエンコーディングとBOMの生成を適切に処理してくれるため、開発者はコンテンツのロジックに集中できます。