学习并了解到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. 代码

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

 1   //...从URL中取出编码后的数字
 2   wchar_t* strURL = L"323211";
 3
 4   int iEncodeNum = _wtoi(strURL);
 5   cout << "iEncodeNum = " << iEncodeNum << endl;
 6
 7   if((iEncodeNum & 0xFFFF0000) == 0)
 8   {
 9       wchar_t wDecodeNum = static_cast<wchar_t>(iEncodeNum);
10       //为输出中文,设置wcout语言环境为中文
11       std::wcout.imbue(locale("chs"));
12       wcout << L"wDecodeNum = " << wDecodeNum << endl;
13   }
14   else
15   {
16       cout << "number > 65535, will cause truncation problem, can't handle this" << endl;
17   }
18   //将wDcodeNum替换入URL中,代替原来的繁
19   //...

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

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

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

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

Best Regards

Kevin Song

   

转载于:https://www.cnblogs.com/KevinSong/p/HTML_URL_Decode.html

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

  1. php中文域名转码,中文域名的punycode编码与其python实现

    Punycode是一个根据RFC 3492标准而制定的编码系统,主要用於把域名从地方语言所采用的Unicode编码转换成为可用於DNS系统的编码.Punycode可以防止所谓的IDN欺骗. 早期的DN ...

  2. mysql 数值型注入_SQL注入之PHP-MySQL实现手工注入-数字型

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

  3. php字符型和数字型的注入,Sql注入的分类:数字型+字符型

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

  4. Matlab子程序: 判断输入类型,将输入转换成数字型输出

    背景:编程过程中,经常需要将输入转换成数字型,转换前必须对输入进行判断.输入可能为空,字符型,数字型,字符型有肯能无法转换成数字.针对以上情况,编制一个子程序进行判断,输出结果. 1.子程序 inpu ...

  5. Debeaver导入csv文件后处理乱码与数字型转varchar丢失精度问题

    Dbeaver目前只支持数据库表或者CSV导入犯事,此博客记录这个导入过程 一.解决中文乱码 1.csv或者excel数据放置好之后正常保存 2.后缀修改为txt,直接确定,不会丢失数据 3.不必使用 ...

  6. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(六)-SQL注入数字型

    目录 前言: 一.SQL 注入漏洞简介 1.简介 2.危害 3.利用 4.防范 二.相关配置 三.编写"SQL 注入漏洞-数字型注入"后端代码 1.使用 springboot 框架 ...

  7. Jpeg解码小结(一)

    2019独角兽企业重金招聘Python工程师标准>>> Source:https://github.com/lzb-cc/JpegCodecs 数据结构: class Matrix{ ...

  8. oracle 非数字型转数字型

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

  9. 处理字符串_7_判断字符串是字符串数字型

    判断字符串是字符串数字型 需求描述 需求:检索temp_str data表的字段data是字符串数字类型的记录这里如果都是字符串或者数字的也符合条件. 解决方法:这里通过translate.repla ...

最新文章

  1. matlab builder for java下载,Matlab Builder JA - Compile Matlab into a Java jar - Free Version?
  2. STM32项目(一) —— 展示车座椅
  3. Cache工作原理,Cache一致性,你想知道的都在这里
  4. 一步一步教你使用Jmail实现邮件的接收与发送
  5. 实现类去实现接口的时候,将接口的注释一起重写出来设置
  6. javase转javaee(java web)
  7. 电力电子技术实验仿真(一)
  8. Android开发CompoundButton抽象类控件类的使用UI之Radio、Check、Toggle
  9. 如何使用 FFMpeg 在 Node.js 中将音频从 Wav 转换为 MP3
  10. python实战篇(七)---一寸照换背景
  11. GNSS精密轨道产品sp3与精密钟差产品clk批量下载(Linux Shell)
  12. 机器学习-数据科学库-day4
  13. 7-36 韩信点兵 (10分)
  14. STM32单片机初学5-IIC通信驱动OLED屏幕
  15. html5分镜头脚本范例,分镜头脚本范例
  16. Linux从入门到放弃 docker
  17. c语言规定 程序中各函数之间().,C语言基础笔试题
  18. python 矩阵转置
  19. springboot返回时间有错解决方案
  20. 利用阿里云主机快速搭建基于wordpress的个人博客网站

热门文章

  1. 大数据即席查询工具——秒级响应
  2. 计算机基础之冯诺依曼体系结构
  3. c语言经典案例 俄罗斯方块,C语言实现俄罗斯方块经典游戏课程设计
  4. 边拆边聊——简单了解DLP投影结构与成像原理
  5. 经典小游戏(密室逃脱全集+答案)
  6. random.seed(0)
  7. 联想r7000p双系统ubuntu20.04触摸板失灵
  8. 清风数模课---多元回归分析
  9. java时间日期获得0点0分0秒(本地时间(时区)),获取当天零点零分时间(本地时间(时区))
  10. Python之基础详解(八):必备,以制作交易收盘价走趋图为例,来可视化处理json格式的文件