0

重複の可能性:
QApplication のインスタンス化後に qDebug() を実行すると、「ユニコード性」が失われます

プロジェクトで Unicode 文字を使用しようとしていますが、Unicode 文字が一部の値 (例: ?) に変換されます。

#include <QtCore/QCoreApplication>
#include <QTextCodec>
#include <QDebug>
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  QTextCodec *codec = QTextCodec::codecForName("UTF-8");
  QTextCodec::setCodecForCStrings(codec);
  //Unicode character here is '
  QString unicode = "Hello I’ve to go";
  qDebug() << "Unicode String: " << unicode;
  return a.exec();
}

上記のコードは、文字列値をHello I?ve to goとして出力します。

4

3 に答える 3

2

C++11 では、Unicode 文字のサポートが追加されています。その Unicode 文字を適切にエスケープしてみてください。

u8"Hello I\u2019ve to go"

これは私にとってはうまくいきます。フォントに U+2019 コードポイントがない可能性は十分にあります?が、適切な文字の代わりにそれを描画しています。

于 2012-10-10T15:55:56.187 に答える
0

test.txt (utf-8)

こんにちは、私は行かなければなりません。

ここに別のテストがあります。

main.cpp

#include <QtCore>

int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  QString unicode = QString::fromUtf16(L"Hello I\u2019ve to go");
  qDebug() << "Unicode String: " << unicode;

  QFile in_file("test.txt");

  if (!in_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    return -1;
  }

  QTextStream in(&in_file);
  while(!in.atEnd()) {
    QString line = in.readLine();
    qDebug() << line;
  }
}

出力:

Unicode String:  "Hello I’ve to go" 
"Hello I’ve to go." 
"Here is another test." 

ハードコードされた値と実行時に読み取られた値から機能しています。ファイルを読んでいる時点で何か問題が発生していると思われます。つまり、間違ったエンコーディングを使用しているか、Latin-1 エンコーディングなどに変換しています。

于 2012-10-10T16:10:33.853 に答える
0

文字列リテラルは、コンパイラによってソース エンコーディングから実行エンコーディングに変換されます。使用している実行エンコーディングは明らかにその文字を処理できないため、「?」に置き換えられます。

コンパイラがそれをサポートしている場合は別の実行エンコーディングを選択するか (gcc が flag-fexec-charsetで行う)、それをサポートしていないコンパイラ (Visual Studio など) を騙して、ソース エンコーディングについて嘘をついてこの変換を行わないようにする必要があります。は。

ソース コードを署名なしで UTF-8 に設定することで、ソース エンコーディングについて VS に嘘をつくことができます。VS は、ソース エンコーディングがシステムの「非 Unicode プログラムのエンコーディング」であると想定します。これは、実行エンコーディングに使用するものと同じです。エンコーディングが同じであると信じているため、変換は実行されず、文字列リテラルは UTF-8 になります。ただし、コンパイラが正しいエンコーディングを知る必要があるソースコード内の他のものを避けるように注意する必要があります. たとえば、これを行うと、ワイド文字列リテラルが正しく変換されません。

別の解決策は、新しい C++11 UTF-8 文字列リテラル:u8"Hello I’ve to go"です。これらは、コンパイラによってソース エンコーディングから実行エンコーディングではなく UTF-8 に変換されます。残念ながら、Visual Studio はまだ UTF-8 文字列リテラルをサポートしていません。


上記のコメントで、「私の実際のプロジェクトでは、この値はファイル名から読み取られます」と言っています。これは、質問で示された問題とはまったく異なる問題を示しています。これを解決するには、ファイル名を正確に取得する方法に関する詳細が必要になります。

投稿したコードの問題と実際の問題は異なるため、投稿したコードを修正する方法を示しても、実際の問題は解決されません。両方を解決する「一般的な解決策」はありません。

于 2012-10-10T15:59:06.807 に答える