2013-02-17 79 views
0

我正在寫一個QT5應用程序(使用QT Creator),它使用像十二生肖這樣的特殊字符。此代碼工作完全正常的Linux Mint的14:unicode字符不能轉換爲cp1252

QString的S =的QString :: fromUtf8( 「\ u2648」);

但是,當我編譯它在Windows XP SP3得到一個編譯器警告它說,當前代碼頁是CP1252和字符\ u2648不能轉換。當我運行該程序時,此字符顯示爲問號。

根據我的系統設置UTF-8(代碼頁65001)安裝在我的Windows。

回答

1

(注意,我沒有t試過了,我不知道你使用的是哪種編譯器,而且完全不熟悉QT,所以我可能是錯的。根據有關Unicode在Windows上的一般知識以下是。)

在Windows上,8位串,一般認爲是在系統的當前代碼頁(也稱爲「ANSI」代碼頁)。這是從來沒有 UTF-8。在你的系統上,顯然是cp1252。所以實際上有兩件事情出錯了:

  1. 您正在指定一個Unicode字符,編譯器試圖將其轉換爲正確的代碼頁。在Windows上,這會導致編譯時錯誤,因爲cp1252沒有代表u + 2648的代碼點。
  2. 但假設代碼會編譯,它仍然不起作用。你將這個字符串傳遞給cp1251,來自uff8,它需要一個UTF-8字符串。由於字符串不是有效的UTF-8,這可能會導致運行時錯誤。

在你的Linux系統上,兩者都是「偶然的」,因爲它使用8位字符串的UTF-8。

得到這個權利,在指定UTF-8 8位串馬上:

QString s = QString::fromUtf8("\xE2\x99\x88"); 
+0

x前面的0創建一個空的(或不可見的)字符串。如果我將您的代碼更改爲「\ xE2 \ x99 \ x88」,我會得到一個方形符號。另外如果我使用89而不是88或其他數字。至少我沒有得到任何編譯器警告。 – 2013-02-17 21:41:34

+0

對不起,這些0不屬於那裏。我刪除了它們。 – oefe 2013-02-17 21:44:46

+0

我試過使用:wchar_t a [] = L「\ u01FF」;並將此類型轉換爲一個給出奇怪的'o'charakter的QString。但這似乎是最高的數字。如果我使用更高的數字,我會再次得到一個方格。 – 2013-02-17 21:51:55

-1

這裏是我的建議得到everithing做工精細:

  1. 只有一個編碼類型UTF-8!如果可能,在任何地方使因此,在QtCreator設置中,爲源UTF-8設置默認代碼頁。

  2. 你可以把你的源代碼在QtCreator:編輯 - >選擇編碼和代碼頁有重裝。如果不能這樣做,請使用Linux控制檯應用程序iconv這樣:

    的iconv -f -t CP1252 UTF-8 your_source_in_cp1251.cpp> your_source_in_utf8.cpp

  3. 我使用此代碼段對於C-串在我的源代碼:在main.cpp添加#include <QTextCodec>,然後執行:

// For correct encoding 
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); 
QTextCodec::setCodecForCStrings(codec); 
+0

我已經嘗試了所有的建議,但它仍然無法正常工作。另外setCodecForCStrings在QT5.0中不可用 – 2013-02-17 20:08:39