2014-02-13 527 views
0

我試圖將一個char數組轉換爲unicode轉義的char數組。如何將字符串轉換爲其unicode轉義符?

說我有一個字符串「C:/İmüp」。 如何將它轉換爲C:/ \ u0130m \ u00fcp as char array or const char

(我得到的「C:/您好İmüp」爲通過ExpandEnvironmentStrings()字符數組,然後我需要編寫一個文件,它的Unicode轉義)

我試過的類型轉換轉換,std::stringstream和ASCII表,查找關於C++ json編碼器的示例,但是我無法得到它的工作

+1

你如何確定保留哪個角色? 「'\ u0043 \ u003a \ u002f \ u0130 \ u006d \ u00fc \ u0070」'也可以接受嗎? – hvd

+0

@ 127以上的hvd字符將會被盜用 – ullyatu

回答

2

試試這個:

std::wstring env; 
// fill env with data from ExpandEnvironmentStringsW()... 

std::stringstream ss; 
for (std::wstring::iterator iter = env.begin(); iter != env.end(); ++iter) 
{ 
    if (*iter <= 127) 
     ss << (char) *iter; 
    else 
     ss << "\\u" << std::hex << std::setfill('0') << std::setw(4) << (int)*iter; 
} 

std::string str = ss.str(); 
// use str as needed... 
+0

謝謝,多數民衆贊成我正在尋找。然而,有沒有機會,我可以做到沒有wstring?我的意思是,如果我使用這個,我需要將'char array'轉換爲'wstring' – ullyatu

+0

如果直接使用'ExpandEnvironmentStringsW()',就像已經提示過的那樣,那麼你就不會有'char'數組與,你將有一個'wchar_t'數組。然後您可以直接循環訪問該數組,而不必使用'wstring'。這使'for'循環更容易編寫。重要的是看每個'wchar_t'並決定如何根據其值來格式化它。由於您使用的是非ASCII字符,因此您不應該首先使用'ExpandEnvironmentStringsA()',否則無論如何您都必須轉換爲'wchar_t'才能獲得正確的結果。 –

+0

現在我明白了,再次感謝你。我花了我2 +天的時間來實現這一點:) – ullyatu

2

首先使用系統默認代碼頁將其從char數組轉換爲wchar_t數組。

然後寫走到您wchar_t的陣列和逸出每Unicode字符代碼> = 128。

P.S.瑣碎代碼更好的是,使你的應用程序的Unicode,所以它會使用Unicode版本的ExpandEnvironmentStrings。這樣您只需要跳過字符串,如果某個環境字符串包含的字符不符合char與您的系統默認代碼頁,則您的應用程序仍然可以正常工作。

+0

128以下的字符可能需要轉義。 – hvd

+1

這取決於他爲什麼需要逃跑。例如,在標準RTF格式中,只有代碼> = 128的字符才需要轉義。 – Soonts

+1

爲了使用Unicode版本的'ExpandEnvironmentStrings()',你不需要製作應用程序Unicode(但你應該),你可以直接調用'ExpandEnvironmentStringsW()'。 –

0

試試這個代碼:

string yourAsciiString = "this is test"; 
string yourUnicodeString = System.Text.Encoding.Unicode.GetString(System.Text.Encoding.ASCII.GetBytes(yourAsciiString)); 
相關問題