2013-11-14 71 views
7

我有一個問題,我需要使用標準字符類型的UTF-8編碼的字符串在C++源代碼,如下所示:有沒有一種簡單的方法在Visual Studio中編寫UTF-8八位字節?

char* twochars = "\xe6\x97\xa5\xd1\x88"; 

通常,如果我想要寫的UTF-8字符我需要使用像上面這樣的八位字節。有沒有什麼在Visual Studio(我使用VS 2013旗艦版),可以讓我只寫例如「ĄĘĆŻ」並自動將每個字符轉換爲多個UTF-8八位字節,就像上面的例子一樣?或者我應該使用const wchar_t*並找到一個可以將寬字符串轉換爲UTF-8編碼的標準字符串的庫?

如果沒有這樣的事情,你能建議任何外部軟件嗎?我真的不想瀏覽每個符號/非拉丁字母的字符映射。

對不起,我的英文, 在此先感謝。

+4

'的#pragma execution_character_set( 「UTF-8」)'使用VC++ 2010的工作,不知道這是否是在VC++ 2013年 – Jigsore

+0

仍然可用,它工作!你爲什麼不把它作爲答案發布,以便我可以接受它? –

回答

16

您可以使用仍然undocumented編譯指示execution_character_set("utf-8")。這樣你的char字符串將被保存爲二進制文件中的UTF-8。順便說一下,這個編譯指示僅適用於Visual C++編譯器。

#include <iostream> 
#include <cstring> 

#pragma execution_character_set("utf-8") 

using namespace std; 

char *five_chars = "ĄĘĆŻ!"; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cout << "This is an UTF-8 string: " << five_chars << endl; 
    cout << "...it's 5 characters long" << endl; 
    cout << "...but it's " << strlen(five_chars) << " bytes long" << endl; 
    return 0; 
} 
+1

太棒了!這是我正在尋找分鐘的提示。 – fmuecke

+0

非常感謝! –

+0

在VS2102中未被識別。該編譯指示在VC++ 2010中得到了支持,然後在VC++ 2012中被遺忘,並且在VC++ 2013中得到了支持[link](http://stackoverflow.com/questions/23607830/does-vc-have-a-compile-option-like -fexec-charset-in-gcc-to-set-the-execution) – TinyRacoon

2

沒有辦法直接在UTF-8中用當前版本的VC++編寫字符串文字。未來的版本應該有UTF-8 string literals

我嘗試將非ASCII文本直接粘貼到源文件中的字符串文字中,並將文件保存爲UTF-8。在十六進制編輯器中查看源文件確認它保存爲UTF-8,但仍不能滿足您的需求。在編譯時,這些字節會映射到當前代碼頁中的某個字符,或者您會收到警告。

因此,現在最便捷的創建字符串文字的方法是明確寫出八位字節,就像您一直在做的那樣。

如果你想做一個運行時轉換,有幾個選項。

  1. Windows API有WideCharToMultiByte,它可以將文本作爲UTF-16並將其轉換爲UTF-8等多字節編碼。
  2. 如果您使用足夠新的編譯器版本和C++運行時,則可以使用std::codecvt將寬字符字符串轉換爲UTF-8。

您可以使用這些技術之一來編寫一個小工具,進行轉換並將它們輸出爲字符串文字所需的顯式八位字節。然後,您可以將輸出複製並粘貼到源代碼中。

+0

看起來有一種方法,您可以從Jigsore的評論中看到,但您的答案也很有用,謝謝! –

相關問題