正文
C++版本的UnEscape 解析\uxxxx\uxxxx编码字符
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
解析类似于这种Unicode编码格式的字符串
\u5b55\u5987\u88c5\u590f\u88c52018\u65b0\u6b3e\u5bbd\u677e\u77ed\u8896\u4e2d\u957f\u6b3e\u4e0a\u8863\u96ea\u7ebaV\u9886\u8774\u8776\u7ed3\u8fde\u8863\u88d9\u590f\u5b63
当然JavaScript 直接调用unescape就可以解析 自己动手写了一个c++版本的
代码如下:
#define GB2312_ACP 936
std::string UnEscape(const char* strSource)
{
std::string strResult;
int nDestStep = ;
int nLength = strlen(strSource);
if (!nLength || nLength < ) return strResult;
char* pResult = new char[nLength + ];
wchar_t* pWbuufer = nullptr;
if (!pResult)
{
pResult = NULL;
return strResult;
}
ZeroMemory(pResult, nLength + );
for (int nPos = ; nPos < nLength;nPos++)
{
if (strSource[nPos] == '\\' && strSource[nPos+]=='u')
{
char szTemp[];
char szSource[];
ZeroMemory(szTemp, );
ZeroMemory(szSource, );
CopyMemory(szSource, (char*)strSource + nPos +, );
sscanf_s(szSource, "%04X",szTemp);
CopyMemory(pResult + nDestStep, szTemp, );
nDestStep += ;
}
}
nDestStep += ;
pWbuufer = new wchar_t[nDestStep];
if (!pWbuufer)
{
delete[] pWbuufer;
pWbuufer = nullptr;
return strResult;
}
ZeroMemory(pWbuufer, nDestStep);
CopyMemory(pWbuufer, pResult, nDestStep);
delete [] pResult;
pResult = nullptr;
CHAR* MultPtr = nullptr;
int MultLen = -;
//GB2312_ACP = 936
MultLen = ::WideCharToMultiByte(GB2312_ACP, WC_COMPOSITECHECK, pWbuufer, -, NULL, NULL, NULL, NULL);
MultPtr = new CHAR[MultLen + ];
if (MultPtr)
{
ZeroMemory(MultPtr, MultLen + );
::WideCharToMultiByte(GB2312_ACP, WC_COMPOSITECHECK, pWbuufer, -, MultPtr, MultLen, NULL, NULL);
strResult = MultPtr;
delete[] MultPtr;
MultPtr = nullptr;
}
delete [] pWbuufer;
pWbuufer = nullptr;
return strResult;
}
调用方式:
char buf[] = "\\u5b55\\u5987\\u88c5\\u590f\\u88c52018\\u65b0\\u6b3e\\u5bbd\\u677e\\u77ed\\u8896\\u4e2d\\u957f\\u6b3e\\u4e0a\\u8863\\u96ea\\u7ebaV\\u9886\\u8774\\u8776\\u7ed3\\u8fde\\u8863\\u88d9\\u590f\\u5b63"; std::string nLength = UnEscape(buf); printf("%s\r\n", nLength.c_str());