0

私は、星座のような特殊文字を使用するQT5アプリケーション(QT Creatorを使用)を作成しています。このコードはLinuxMint14で完全に機能します。

QString s = QString :: fromUtf8( "\ u2648");

しかし、Windows XP SP3でコンパイルすると、現在のコードページがcp1252であり、文字\u2648を変換できないというコンパイラ警告が表示されます。プログラムを実行すると、この文字が疑問符として表示されます。

私のシステム設定によると、UTF8(コードページ65001)がWindowsにインストールされています。

4

2 に答える 2

1

(注:私はこれを試していません。使用しているコンパイラがわかりません。また、QTに完全に慣れていないため、間違っている可能性があります。以下は、Windows上のUnicodeに関する一般的な知識に基づいています。)

Windowsでは、8ビット文字列は通常、システムの現在のコードページ(「ANSI」コードページとも呼ばれます)にあると見なされます。これはUTF-8ではありません。お使いのシステムでは、明らかにcp1252です。したがって、実際には2つの問題が発生しています。

  1. コンパイラが正しいコードページに変換しようとするUnicode文字を指定しています。Windowsでは、cp1252にu + 2648を表すコードポイントがないため、コンパイル時エラーが発生します。
  2. しかし、コードがコンパイルされると仮定すると、それでも機能しません。cp1251にあるこの文字列をfromUtf8に渡します。fromUtf8はUTF-8文字列を必要とします。文字列は有効なUTF-8ではないため、ランタイムエラーが発生する可能性があります。

Linuxシステムでは、8ビット文字列にUTF-8を使用しているため、どちらも「偶然に」機能します。

これを正しく行うには、UTF-8で8ビット文字列をすぐに指定します。

QString s = QString::fromUtf8("\xE2\x99\x88");
于 2013-02-17T20:42:46.093 に答える
-1

これがeverithingをうまく機能させるための私のアドバイスです:

  1. エンコーディングタイプUTF-8は1つだけです!可能であればどこでも使用してください。したがって、QtCreator設定で、ソースUTF-8のデフォルトのコードページを設定します。

  2. QtCreatorでソースコードを変換できます:編集->エンコーディングを選択し、コードページにリロードします。それができない場合は、Linuxコンソールアプリケーションをiconv次のように使用します。

    iconv -f cp1252 -t utf-8 your_source_in_cp1251.cpp> your_source_in_utf8.cpp

  3. ソースコードのC文字列にこのコードスニペットを使用します:main.cppadd#include <QTextCodec>で、次に実行します:

// For correct encoding
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForCStrings(codec);
于 2013-02-17T19:18:19.423 に答える