字符中包含汉字和英文字母。
11 个解决方案
#1
不是有两个API嘛
MultiByteToWideChar[多字节字符串转宽字符]
WideCharToMultiByte[宽字符转多字节字符串]
MultiByteToWideChar[多字节字符串转宽字符]
WideCharToMultiByte[宽字符转多字节字符串]
#2
++
#3
当年写的代码,当时用来转化XML的UTF8格式的汉子,希望对你有用
string UTF8_To_String(const char* szSrc)
{
if(NULL==szSrc || 0==strlen(szSrc))
{
return "";
}
int nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, NULL, 0);
unsigned short *wszGBK = new unsigned short[nLen+1];
memset(wszGBK, 0, nLen*2+2);
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, (LPWSTR)wszGBK, nLen);
nLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char* szGBK = new char[nLen+1];
memset(szGBK, 0, nLen+1);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, nLen, NULL, NULL);
string strTemp(szGBK);
delete []wszGBK;
wszGBK = NULL;
delete []szGBK;
szGBK = NULL;
return strTemp;
}
string String_To_UTF8(const string& strSrc)
{
if (strSrc.empty())
{
return "";
}
int nLen=MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), -1, NULL,0);
WCHAR* pwBuf = new WCHAR[nLen+1];
memset(pwBuf, 0, nLen * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), strSrc.length(), pwBuf, nLen);
nLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, 0, NULL, NULL);
char *pBuf=new char[nLen + 1];
memset(pBuf, 0, nLen + 1);
WideCharToMultiByte (CP_UTF8, 0, pwBuf, -1, pBuf, nLen, NULL,NULL);
string strTemp(pBuf);
delete[] pBuf;
pBuf = NULL;
delete[] pwBuf;
pwBuf = NULL;
return strTemp;
}
#4
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
#5
以00,作为特征,或者换行作为特征来区分,只能这样了。
#6
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
#7
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
宽字元中文和多字节中文中间没有分割?
#8
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
宽字元中文和多字节中文中间没有分割?
中文在GB2312和Unicode-16编码中都是2字节。
比如“爱”字,多字节:0xb0ae ;宽字符:0x3172
我对编码不是很了解,不太清楚是不是有一定的规则可以判断。
#9
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
#10
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
宽字元中文和多字节中文中间没有分割?
中文在GB2312和Unicode-16编码中都是2字节。
比如“爱”字,多字节:0xb0ae ;宽字符:0x3172
我对编码不是很了解,不太清楚是不是有一定的规则可以判断。
如果完全没有分割,如换行,空格做间隔,那肯定没有办法区分了。
或者把数据传上来分析一下。
#11
忘了结了~~
#1
不是有两个API嘛
MultiByteToWideChar[多字节字符串转宽字符]
WideCharToMultiByte[宽字符转多字节字符串]
MultiByteToWideChar[多字节字符串转宽字符]
WideCharToMultiByte[宽字符转多字节字符串]
#2
++
不是有两个API嘛
MultiByteToWideChar[多字节字符串转宽字符]
WideCharToMultiByte[宽字符转多字节字符串]
#3
当年写的代码,当时用来转化XML的UTF8格式的汉子,希望对你有用
string UTF8_To_String(const char* szSrc)
{
if(NULL==szSrc || 0==strlen(szSrc))
{
return "";
}
int nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, NULL, 0);
unsigned short *wszGBK = new unsigned short[nLen+1];
memset(wszGBK, 0, nLen*2+2);
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, (LPWSTR)wszGBK, nLen);
nLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char* szGBK = new char[nLen+1];
memset(szGBK, 0, nLen+1);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, nLen, NULL, NULL);
string strTemp(szGBK);
delete []wszGBK;
wszGBK = NULL;
delete []szGBK;
szGBK = NULL;
return strTemp;
}
string String_To_UTF8(const string& strSrc)
{
if (strSrc.empty())
{
return "";
}
int nLen=MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), -1, NULL,0);
WCHAR* pwBuf = new WCHAR[nLen+1];
memset(pwBuf, 0, nLen * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), strSrc.length(), pwBuf, nLen);
nLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, 0, NULL, NULL);
char *pBuf=new char[nLen + 1];
memset(pBuf, 0, nLen + 1);
WideCharToMultiByte (CP_UTF8, 0, pwBuf, -1, pBuf, nLen, NULL,NULL);
string strTemp(pBuf);
delete[] pBuf;
pBuf = NULL;
delete[] pwBuf;
pwBuf = NULL;
return strTemp;
}
#4
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
#5
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
#6
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
#7
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
宽字元中文和多字节中文中间没有分割?
#8
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
宽字元中文和多字节中文中间没有分割?
中文在GB2312和Unicode-16编码中都是2字节。
比如“爱”字,多字节:0xb0ae ;宽字符:0x3172
我对编码不是很了解,不太清楚是不是有一定的规则可以判断。
#9
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
#10
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?
以00,作为特征,或者换行作为特征来区分,只能这样了。
感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?
宽字元中文和多字节中文中间没有分割?
中文在GB2312和Unicode-16编码中都是2字节。
比如“爱”字,多字节:0xb0ae ;宽字符:0x3172
我对编码不是很了解,不太清楚是不是有一定的规则可以判断。
如果完全没有分割,如换行,空格做间隔,那肯定没有办法区分了。
或者把数据传上来分析一下。
#11
忘了结了~~