如何將UTF-8 char *中的字符串轉換爲CString?將UTF-8 char *轉換爲CString
回答
撥打電話MultiByteToWideChar
,其代碼頁爲CP_UTF8
,然後正常使用CString。
如果字符串只包含ASCII字符與代碼0到127你可能威脅您的UTF-8字符串作爲ASCII字符串,並將其初始化CString的:
CString my_cstr((char*)my_string);
否則(如果您的UTF-8字符串包含一些其他字符),你沒有簡單的方法從它獲得char *字符串。
bool Utf8ToCString(CString& cstr, const char* utf8Str)
{
size_t utf8StrLen = strlen(utf8Str);
if(utf8StrLen == 0)
{
cstr.Empty();
return true;
}
LPTSTR* ptr = cstr.GetBuffer(utf8StrLen+1);
#ifdef UNICODE
// CString is UNICODE string so we decode
int newLen = MultiByteToWideChar(
CP_UTF8, 0,
utf8Str, utf8StrLen, ptr, utf8StrLen+1
);
if(!newLen)
{
cstr.ReleaseBuffer(0);
return false;
}
#else
WCHAR* buf = (WCHAR*)malloc(utf8StrLen);
if(buf == NULL)
{
cstr.ReleaseBuffer(0);
return false;
}
int newLen = MultiByteToWideChar(
CP_UTF8, 0,
utf8Str, utf8StrLen, buf, utf8StrLen
);
if(!newLen)
{
free(buf);
cstr.ReleaseBuffer(0);
return false;
}
assert(newLen < utf8StrLen);
newLen = WideCharToMultiByte(
CP_ACP, 0,
buf, newLen, ptr, utf8StrLen
);
if(!newLen)
{
free(buf);
cstr.ReleaseBuffer(0);
return false;
}
free(buf);
#endif
cstr.ReleaseBuffer(newLen);
return true;
}
雖然此函數是有效的既UNICODE和非UNICODE配置IMHO在Win32程序使用UNICODE配置更加多產(一般而言,在這種功能)。
這不是一個解決方案。解決方案是找出目標單字節代碼頁並將UTF-8字符串轉換爲該CP的單字節字符串。 – Jurlie 2011-04-15 07:13:07
@Jurlie:閱讀memcpy之前的評論。雖然可能我現在會發布實施。 – 2011-04-15 07:16:28
編輯帖子以包含UTF8到當前的8位代碼頁轉換。 – 2011-04-15 07:28:38
- 1. 將寬CString轉換爲char *
- 2. 從CString轉換爲char */TCHAR *
- 3. char []到CString轉換
- 4. 隱式將CString轉換爲char *
- 5. 如何將CString轉換爲const char *?
- 6. 將XML非法&char轉換爲utf8 - python
- 7. BSTR轉換爲CString的CString
- 8. 將long double轉換爲CString
- 9. 將Wstring轉換爲CString
- 10. 將COleVariant轉換爲CString
- 11. 將CString轉換爲std :: wstring
- 12. 如何將cstring轉換爲NSString和NSString爲cstring?
- 13. 問題:如何將CString轉換爲C++ MFC中的const char *
- 14. MFC - 如何將WCHAR轉換爲CString?
- 15. 將CString轉換爲字符數組?
- 16. 如何將CString轉換爲ofstream?
- 17. 將char *轉換爲char? C++
- 18. 將UTF8轉換爲ANSI?
- 19. 無法將CString轉換爲BYTE數組
- 20. 將Unicode轉換爲UTF8
- 21. Python將latin1轉換爲UTF8
- 22. 將utf8轉換爲1251
- 23. 將UTF8轉換爲Windows-1252
- 24. 將Utf8轉換爲Unicode
- 25. 將latin1轉換爲UTF8
- 26. 將文本轉換UTF8爲char或字符串
- 27. *將char轉換爲main並將* char轉換爲struct
- 28. 將utf8代碼點字符串轉換爲utf8 <U+0161>轉換爲utf8
- 29. 我無法將cstring轉換爲int
- 30. C++ LibCurl - 將CURLcode轉換爲CString
我希望它被轉換爲char *不是wchar_t * ..是否有任何方法? – Greenhorn 2011-04-15 06:49:27
@Athreya:你爲什麼要這樣做?這種轉換必然是有損的 - 如果字符串是以Unicode開頭的,是什麼讓你認爲它只包含ANSI字符? – ildjarn 2011-04-15 06:53:06
我需要使用OCI庫解析和執行語句,它只接受char *作爲輸入 – Greenhorn 2011-04-15 06:54:39