VC下Unicode转UTF-8, 偶数长度的中文字符串没有关问题,奇数长度的中文字符串就会出有关问题
VC下Unicode转UTF-8, 偶数长度的中文字符串没问题,奇数长度的中文字符串就会出问题!
上面两种转换方式都试过了, 都是同样的问题,偶数长度中文字符串,像"张三"之类的就不会出问题!但像"张三三"一类奇数长度的字符串转化出来的就有问题!
PS :我是将转换后的字符串,插入sqlite数据库, 然后用可视化的数据库管理软件打开数据库看是否是乱码!
------解决方案--------------------
先验证自己转UTF-8有没有转换正确,把源字符串用其他工具(比如UE)转换到UTF-8,查看2进制比较是否一样
------解决方案--------------------
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
------解决方案--------------------
------解决方案--------------------
void ConvertANSIToUTF8(CString &strANSI)
{
int nLen = ::MultiByteToWideChar(CP_ACP,MB_ERR_INVALID_CHARS,(LPCTSTR)strANSI,-1,NULL,0);
unsigned short * wszUTF_8 = new unsigned short[nLen+1];
memset(wszUTF_8, 0, nLen * 2 + 2);
nLen = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strANSI, -1, wszUTF_8, nLen);
UFT8Switch(CString& str)
{
std::string s = CT2A(str, CP_UTF8);
str = s.c_str();
return str;
}
std::string Unicode2Utf8(const std::wstring& widestring)
{
int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);
if (utf8size == 0)
{
throw std::exception("Error in conversion.");
}
std::vector<char> resultstring(utf8size);
int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);
if (convresult != utf8size)
{
throw std::exception("La falla!");
}
return std::string(&resultstring[0]);
}
上面两种转换方式都试过了, 都是同样的问题,偶数长度中文字符串,像"张三"之类的就不会出问题!但像"张三三"一类奇数长度的字符串转化出来的就有问题!
PS :我是将转换后的字符串,插入sqlite数据库, 然后用可视化的数据库管理软件打开数据库看是否是乱码!
VC
UTF-8
Unicode
------解决方案--------------------
先验证自己转UTF-8有没有转换正确,把源字符串用其他工具(比如UE)转换到UTF-8,查看2进制比较是否一样
------解决方案--------------------
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
------解决方案--------------------
void ConvertUtf8ToGBK(CString &,unsigned char * strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
//strUtf8 = szGBK;
amp=szGBK;
delete[] szGBK;
delete[] wszGBK;
}
------解决方案--------------------
void ConvertANSIToUTF8(CString &strANSI)
{
int nLen = ::MultiByteToWideChar(CP_ACP,MB_ERR_INVALID_CHARS,(LPCTSTR)strANSI,-1,NULL,0);
unsigned short * wszUTF_8 = new unsigned short[nLen+1];
memset(wszUTF_8, 0, nLen * 2 + 2);
nLen = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strANSI, -1, wszUTF_8, nLen);