如何將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 */TCHAR *
- 2. 將Wstring轉換爲CString
- 3. 將COleVariant轉換爲CString
- 4. 將CString轉換爲std :: wstring
- 5. 如何將cstring轉換爲NSString和NSString爲cstring?
- 6. 問題:如何將CString轉換爲C++ MFC中的const char *
- 7. 將CString轉換爲字符數組?
- 8. 如何將CString轉換爲ofstream?
- 9. 無法將CString轉換爲BYTE數組
- 10. 將Unicode轉換爲UTF8
- 11. 將UTF8轉換爲Windows-1252
- 12. 將utf8代碼點字符串轉換爲utf8 <U+0161>轉換爲utf8
- 13. 如何將CString轉換爲CByteArray?
- 14. 如何將nsstring轉換爲cString?
- 15. vC++ - 如何將CString轉換爲LPCWSTR
- 16. 如何將cstring轉換爲NSString?
- 17. 如何將_bstr_t轉換爲CString
- 18. 我無法將cstring轉換爲int
- 19. 在C++中將長轉換爲CString
- 20. C++ LibCurl - 將CURLcode轉換爲CString
- 21. 如何將CString轉換爲UCHAR數組?
- 22. 如何將CString轉換爲CTime在c + +?
- 23. 將int轉換爲char
- 24. 將char *轉換爲int
- 25. 將char轉換爲ascii值
- 26. 將float轉換爲char *
- 27. C#將Char轉換爲KeyValue
- 28. 將boost :: uuid轉換爲char *
- 29. 將char *轉換爲std :: vector
- 30. 將double轉換爲unsigned char?
我希望它被轉換爲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