学习并了解到Html编码的知识,源于工作中的产品需求。如果一个URL里面包含Puny Code(不仅仅指中文,还可能是韩文等Unicode里非英文的国家文字,本文以含中文的URL为例),而且这个URL刚好被保存在Html中作为链接,那么其中的Puny Code将会被编码,因为中文等字符不能直接储存在Html的链接中。如果这时使用工具提取Html中URL,所得到的URL就需要解码处理。

一.  Html编码与解码举例

  真实的URL:www.繁体中文.google.com

  Html中的URL:    

<a href="http://www.繁体中文.google.com">www.<span
style='font-family:"MS Gothic"'>$BHKBNCfJ8(J</span>.google.com</a>

  从<a>标签的href中,可以看到,这时URL已经按照Html的格式被编码,编码后的URL是http://www.繁体中文.google.com

  由此可见,Html对于Puny Code的编码方式如下,以"繁"字举例,

  繁  —> 繁

  主要格式是 "&#" + 一个十进制数 + ";",而这个十进制数正是汉字"繁"的中文内码。"32321"转换为十六进制是"7E41",通过查Unicode表可知,"7E41"正对应着汉字"繁",如下图(Unicode Table:http://www.khngai.com/chinese/charmap/tbluni.php?page=3),

    

二.  URL解码实例(C++实现)

  1. 算法思路

    依次遍历URL(假设URL保存在wchar_t宽字符数组中,使用wchar_t宽字符存储Unicode编码集),遇到特定格式&#,取出其中的数字32321,然后将其强制转换成wchar_t宽字符,再将'繁'替换为此宽字符,这样即可。

    遍历一遍URL后,便可以得到解码后的URL。

    2. 代码

    这里给出的只是字符转换部分,如下,

   //...从URL中取出编码后的数字
wchar_t* strURL = L""; int iEncodeNum = _wtoi(strURL);
cout << "iEncodeNum = " << iEncodeNum << endl; if((iEncodeNum & 0xFFFF0000) == )
{
wchar_t wDecodeNum = static_cast<wchar_t>(iEncodeNum);
//为输出中文,设置wcout语言环境为中文
std::wcout.imbue(locale("chs"));
wcout << L"wDecodeNum = " << wDecodeNum << endl;
}
else
{
cout << "number > 65535, will cause truncation problem, can't handle this" << endl;
}
//将wDcodeNum替换入URL中,代替原来的繁
//...

    这里注意的是,如果数字大于65535,即大于两个字节,那么采用static_cast<wchar_t>做类型转换,将导致截断问题,解码失败。但一般来说常用的Unicode字符都在前65535个中,所以这个问题应该不用过多考虑。

   运行结果:

   

三.  知识扩展:关于Unicode和UTF-8,UTF-16(因为之前我一直没有搞清楚,在解这个问题的时候顺便学习下,希望对大家也有帮助:-))   

   1. 字符集和字符编码

    字符集(Charset:是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

    字符编码(Character encoding把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和通过通信网络的传递。

   2. Unicode和UTF-8,UTF-16

    [Unicode]为表达任意语言的任意字符而设计。它使用字节的数字来表达每个字母、符号,或者表意文字(ideograph)。每个数字代表唯一的至少在某种语言中使用的符号。Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

    [UTF-16]尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前个以外的字符。因此,就有了另外一种Unicode编码方式,叫做UTF-16(因为16位 = 2字节)。UTF-16将0–65535范围内的字符编码成2个字节。

    [UTF-8]一种针对Unicode的可变长度字符编码,UTF-8使用一至四个字节为每个字符编码。(字符的大小不确定,1到4个字节都有可能)。

字符的问题自己以前总是含混不清,经过这次学习相信有了更深了解,以后还要多多写博客,至少一周一篇,总结工作学习中遇到的小问题,知识点:-)

Best Regards

Kevin Song

   

Html编码(&#数字型)与解码小结 - 针对Puny Code(中文域名)的解码处理的更多相关文章

  1. SQL数字型注入代码审计

    数字型注入 SQL注入攻击,简称注入攻击,是发生于应用程序与数据库层的安全漏洞. 简而言之,是在输入的字符串之中注入sql指定,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器 ...

  2. Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

  3. SQL注入之PHP-MySQL实现手工注入-数字型

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...

  4. (转载)Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

  5. js关于对象键值为数字型时输出的对象自动排序问题的解决方法

    一.对象键值为数字型时输出的对象自动排序问题如: var objs = {    "1603":{id:"1603"},    "1702" ...

  6. oracle 非数字型转数字型

    原文:oracle 非数字型转数字型 oracle中如果一个字段内容不全是数字型 可以通过以下方式过滤 to_number(substr(translate(a.vital_signs_cvalues ...

  7. (转)java判断string变量是否是数字的六种方法小结

    java判断string变量是否是数字的六种方法小结 (2012-10-17 17:00:17) 转载▼ 标签: it 分类: 转发 1.用JAVA自带的函数 public static boolea ...

  8. float:浮点型double:双精度实型decimal:数字型单精度浮点数(Single)双精度浮点数(double)

        单精度浮点数(Single) 双精度浮点数(double)       Decimal为SQL Server.MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小 ...

  9. 使用JFileChooser实现在指定文件夹下批量添加根据“数字型样式”或“非数字型样式”命令的文件夹

    2018-11-05 20:57:00开始写 Folder.java类 import javax.swing.JFrame; import javax.swing.JPanel; import jav ...

随机推荐

  1. HTTP协议和WebSocket协议(一)

    转自:https://www.jianshu.com/p/0e5b946880b4# HTTP HTTP的地址格式如下: http_URL = "http:" "//&q ...

  2. css过渡transition

    定义 过渡transition是一个复合属性,包括transition-property.transition-duration.transition-timing-function.transiti ...

  3. WEB视频播放器插件,总结

    WEB视频播放器插件,总结 2018年07月29日 20:42:11 流光忆莲 阅读数:572更多 个人分类: 推荐文章收藏   以下是关于网页中嵌入视频播放插件的各种资料的总结 基于H5的Vedio ...

  4. spark Failed to get database default, returning NoSuchObjectException

    解决方法:1)Copy winutils.exe from here(https://github.com/steveloughran/winutils/tree/master/hadoop-2.6. ...

  5. Windows下 virtualenv 使用

    Windows下 virtualenv 使用 win python virtualenv 首先在电脑上安装两个不同版本的python mkvirtualenv --python C:\Python34 ...

  6. Could not read settings.xml

    这个问题为什么会发生? 其实不要想太多, 1.文件格式是utf-8 2.其中的报文格式非常重要,千万不能弄错,如果多了一处注释,就会发生以上问题,拼写的时候多注意语义

  7. SpringMVC---彻底解决/和/*的问题!到底该用哪一个?

    出处: https://blog.csdn.net/sinat_33921105/article/details/81951156 在web开发中我们经常会遇到/和/*的问题,有的时候稍不注意就容易忘 ...

  8. HBase学习(一)

    HBase是建立在Hadoop文件系统之上的分布式面向列的数据库.它是一个开源项目,是横向扩展的. HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数据.它利用了Hado ...

  9. 3d Max 2019安装失败怎样卸载3dsmax?错误提示某些产品无法安装装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  10. Java异常处理学习

    今天才开通了博客园的博客,希望可以记录自己学习的点点滴滴.最近去处理了一些私人事情,有点烦人,希望自己不要被这些破事所影响. 最近在看马士兵老师的Java基础的视频,(中断了一周)发现本科时候的胡老师 ...