免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9072 | 回复: 7
打印 上一主题 下一主题

[C++] 怎样解码HTML中的转义字符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-11 00:48 |只看该作者 |倒序浏览
在HTML中,由于中文等字符是通过编码的,因此得到HTML文件后,怎样解码HTML中的转义字符比较头痛。有那位高人能提供解码的方式或者代码。
比如“Foxmail著名”对应的是"Foxmail著名"
通过怎样的解码实现把“著名”转换为“著名”呢?
因为是个小程序,所以希望不需要什么库来进行转换。
谢谢先了。

论坛徽章:
0
2 [报告]
发表于 2007-11-11 14:58 |只看该作者
看得眼花也没看出来你希望怎么转

论坛徽章:
0
3 [报告]
发表于 2007-11-11 18:14 |只看该作者
你是说&#xxxx;这样的东西?

论坛徽章:
0
4 [报告]
发表于 2007-11-11 18:18 |只看该作者
/*! \brief 将"&#xxxxx;"这样的东西解码为汉字
*
*
*  例如:\li \c 输入: "超"
*        \li \c 输出:"超"
*/
std::string chineseCharDecode(const std::string& from);


/*! \brief 将一个字符从一种编码转换到另外一种编码
*
*  \param \li \c val 要转换的字符。例如36229
*  \param \li \c encTo 转换为什么编码格式,例如"GB2312"
*  \param \li \c encFrom val的编码格式。例如"UTF-16"
*  \return  转换的结果,例如"超"
*
*/
std::string convChar(uint32_t val,const char* encTo,const char* encFrom);

[[i] 本帖最后由 snnn 于 2007-11-11 18:20 编辑 [/i]]

论坛徽章:
0
5 [报告]
发表于 2007-11-11 18:19 |只看该作者
std::string chineseCharDecode(const std::string& str){
  std::istringstream iss(str);
  std::ostringstream oss;
  char c;
  int v;
  ///一个个字符的读入,寻找"&#[0-9]+;"这样的模式
  while(1){
    iss>>c;
    if(!iss) break;
    if(c=='&'){
      iss>>c;
      if(!iss) break;
      if(c=='#'){
        iss>>v;
        if(!iss){
          ///&#后面读入的不是数字
          oss<<"&#";
          iss.clear();
          continue;
        }
        iss>>c;
        if(!iss){
          ///&#3334这样的后面就没了。也没有分号
          oss<<"&#"<<v;
          break;
        }
        if(c==';'){
          ///匹配正确
          try{
            oss<<convChar(v,getDefaultEncoding<std::string>().c_str(),"UTF-16");
          }
          catch(...){
            oss<<"&#"<<v<<c<<";";
          }
        }
        else{
          oss<<"&#"<<v<<c;
        }
      }
      else {
        oss<<'&'<<c;
      }
    }
    else oss<<c;
  }
  return oss.str();
}

std::string convChar(uint32_t val,const char* encTo,const char* encFrom){
  iconv_t pt=iconv_open(encTo,encFrom);
  if(pt== (iconv_t)-1){
    std::cout<<"iconv_open 失败"<<std::endl;
    return "";
  }
  iconv(pt,NULL,NULL,NULL,NULL);
  uint8_t x[8];
  uint8_t* p=x;
  *(reinterpret_cast<uint16_t*>(p))=0xfeff;
  p+=2;
  *(reinterpret_cast<uint32_t*>(p))=val;
  p+=4;
  *(reinterpret_cast<uint16_t*>(p))=0;
  const char * str=(const char*)x;
  char* out=new char[100];
  size_t b=100;
  const char** in=&str;
  size_t lenin=sizeof(x);
  char* buf=out;
  int ret=iconv(pt,in,&lenin,&out,&b);
  if(ret){
    //    std::cout<<"转换失败\n";
    switch(errno){
    case E2BIG:
      delete[] buf;
      THROW("There  is not sufficient room at *outbuf.\n");
      break;
    case EILSEQ:
      delete[] buf;
      THROW(" An invalid multibyte sequence has "
        "been  encountered  in the input.\n");
      break;
    case EINVAL:
      delete[] buf;
      THROW(" An incomplete multibyte sequence has  been  encountered in the input.\n");
      break;
    default:
      delete[] buf;
      THROW("未知的errno\n");
    }
  }
  iconv_close(pt);
  std::string retval(buf);
  delete[] buf;
  return retval;
}

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
6 [报告]
发表于 2007-11-12 13:54 |只看该作者
CString CIconDlg::WebStr2Str(LPCSTR lpBuf)
{
        int nLen;
        if (!lpBuf)
        {
                nLen = 0;
        }
        else
        {
                nLen = ::lstrlen(lpBuf);
        }

        CString s;
        int i = 0;
        while (i<nLen)
        {
                if (lpBuf == '%')
                {
                        BYTE c1 = lpBuf[i+1];
                        BYTE c2 = lpBuf[i+2];
                        i += 2;
                        if (c1 >= '0' && c1 <= '9')
                        {
                                c1 = (c1 - '0') * 16;
                        }
                        else if (c1>='A' && c1<='Z')
                        {
                                c1 = (c1 - 'A' + 10) * 16;
                        }
                        else if (c1 >= 'a' && c1 <= 'a')
                        {
                                c1 = (c1 - 'a' + 10) * 16;
                        }
                        if (c2 >= '0' && c2 <= '9')
                        {
                                c2 = c2 - '0';
                        }
                        else if (c2 >= 'A' && c2 <= 'Z')
                        {
                                c2 = c2 - 'A' + 10;
                        }
                        else if (c2 >= 'a' && c2 <= 'z')
                        {
                                c2 = c2 - 'a' + 10;
                        }

                        char szStr[2];       
                        szStr[0] = c1 + c2;
                        szStr[1] = 0;
                        s += szStr;
                }
                else if (lpBuf == '+')
                {
                        s += " ";
                }
                else
                {
                        s += CString(&lpBuf, 1);
                }
                i++;
        }
        return s;
}

论坛徽章:
0
7 [报告]
发表于 2007-11-16 13:06 |只看该作者
To:cheng_lai_shun
首先编译通过不了
To:snnn  
我希望不需要使用其它的库。

因为这个页面的问题,我在问题中提交的&#xxxx;这样的东西,被转换为中文字符了。
我的意思是,像 snnn说的那样&#xxxx;进行转换为中文字符的正常显示。

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
8 [报告]
发表于 2007-11-20 14:35 |只看该作者
这个是VC6下编译过 了的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP