2011-01-24 165 views
14

我是一種新的使用Unicode字符串和指針,我不知道如何將Unicode轉換爲ASCII碼,反之亦然。以下是我想要做的,轉換Unicode字符串,反之亦然

const wchar_t *p = L"This is a string"; 

如果我想將其轉換爲char*,怎麼會與轉換wchar_t*char*,反之亦然轉換工作?

,或者使用wstringstring類對象,反之亦然

std::wstring wstr = L"This is a string"; 

價值,如果我是正確的,可你只是字符串複製到一個新的緩衝區,無需轉換?

回答

3

該解決方案是平臺相關的。在Windows上使用MultiByteToWideCharWideCharToMultiByte API函數。在Unix/linux平臺上iconv庫相當流行。

+0

請注意,如https://support.microsoft.com/zh-CN/kb/960293中所述,轉換代碼頁50225(韓文 - ISO-2022-KR)會錯誤地轉換字符時,MultiByteToWideChar存在錯誤 - 建議的解決方法是使用`IMultiLanguage :: ConvertStringToUnicode`,而不是正確地轉換相同的字符 - 請更新答案以使其更清晰可見。 – Coder12345 2015-09-02 12:52:16

3

C++本身不提供此功能。您需要一個單獨的庫,例如libiconv

0

的加寬()算法轉換charwchar_t

char a; 
a = 'a'; 
whcar_t wa = cin.widen(a); 

當然,你必須把它變成一個循環。並解決*; 相反是由narrow()

+0

這隻適用於ISO-8859-1。 – dan04 2011-01-25 01:07:27

22

未來(VS 2010已經支持的話),這將是在標準C可能++(最後!):

#include <string> 
#include <locale> 
#include <codecvt> 
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; 
const std::wstring wide_string = L"This is a string"; 
const std::string utf8_string = converter.to_bytes(wide_string); 
+4

我認爲在最後一行有一個錯字`std :: wstring`應該是`std:string` – 2013-03-24 06:22:49

3

C標準庫函數:mbstowcswcstombs

3

從ASCII轉換到Unicode,反之亦然是相當微不足道的。按照設計,前128個Unicode值與ASCII相同(實際上,前256個等於ISO-8859-1)。

所以下面的代碼工作在系統中char是ASCII和wchar_t是Unicode:

const char* ASCII = "Hello, world"; 
std::wstring Unicode(ASCII, ASCII+strlen(ASCII)); 

你不能扭轉它這個簡單:漢在Unicode中確實存在,但不是在ASCII,所以你會如何「轉換」它?

相關問題