多字节与宽字符相混字符串 解码

时间:2022-03-23 20:18:04
现有一个字符串,是多字节与宽字符相混,能把它统一转换成多字节或宽字符编码么?
字符中包含汉字和英文字母。

11 个解决方案

#1


不是有两个API嘛
MultiByteToWideChar[多字节字符串转宽字符]
WideCharToMultiByte[宽字符转多字节字符串]

#2


++

引用 1 楼 wangdahu888 的回复:
不是有两个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


引用 4 楼 erave5 的回复:
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

#6


引用 5 楼 zjq9931 的回复:
Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?

#7


引用 6 楼 erave5 的回复:
Quote: 引用 5 楼 zjq9931 的回复:

Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?

宽字元中文和多字节中文中间没有分割?

#8


引用 7 楼 zjq9931 的回复:
Quote: 引用 6 楼 erave5 的回复:

Quote: 引用 5 楼 zjq9931 的回复:

Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以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


引用 8 楼 erave5 的回复:
Quote: 引用 7 楼 zjq9931 的回复:

Quote: 引用 6 楼 erave5 的回复:

Quote: 引用 5 楼 zjq9931 的回复:

Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?

宽字元中文和多字节中文中间没有分割?

中文在GB2312和Unicode-16编码中都是2字节。
比如“爱”字,多字节:0xb0ae ;宽字符:0x3172
我对编码不是很了解,不太清楚是不是有一定的规则可以判断。

如果完全没有分割,如换行,空格做间隔,那肯定没有办法区分了。
或者把数据传上来分析一下。

#11


忘了结了~~

#1


不是有两个API嘛
MultiByteToWideChar[多字节字符串转宽字符]
WideCharToMultiByte[宽字符转多字节字符串]

#2


++

引用 1 楼 wangdahu888 的回复:
不是有两个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


引用 4 楼 erave5 的回复:
可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

#6


引用 5 楼 zjq9931 的回复:
Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?

#7


引用 6 楼 erave5 的回复:
Quote: 引用 5 楼 zjq9931 的回复:

Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?

宽字元中文和多字节中文中间没有分割?

#8


引用 7 楼 zjq9931 的回复:
Quote: 引用 6 楼 erave5 的回复:

Quote: 引用 5 楼 zjq9931 的回复:

Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以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


引用 8 楼 erave5 的回复:
Quote: 引用 7 楼 zjq9931 的回复:

Quote: 引用 6 楼 erave5 的回复:

Quote: 引用 5 楼 zjq9931 的回复:

Quote: 引用 4 楼 erave5 的回复:

可能 是我没有说清楚,我要转化的字符串里面,不是纯的多字节或宽字符,而是多字节和宽字符的混合。
可能是这样的字符串:一串多字节+一串宽字符+一串多字节+一串宽字符,怎么分割?

以00,作为特征,或者换行作为特征来区分,只能这样了。

感谢回复!对于英文用00作为特征应该没有问题,但里面还会有中文,怎么区分?

宽字元中文和多字节中文中间没有分割?

中文在GB2312和Unicode-16编码中都是2字节。
比如“爱”字,多字节:0xb0ae ;宽字符:0x3172
我对编码不是很了解,不太清楚是不是有一定的规则可以判断。

如果完全没有分割,如换行,空格做间隔,那肯定没有办法区分了。
或者把数据传上来分析一下。

#11


忘了结了~~