专栏首页宋凯伦的技术小栈Html编码(&#数字型)与解码小结 - 针对Puny Code(中文域名)的解码处理

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

  学习并了解到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.&#32321;&#20307;&#20013;&#25991;.google.com">www.<span
style='font-family:"MS Gothic"'>$BHKBNCfJ8(J</span>.google.com</a>

  从<a>标签的href中,可以看到,这时URL已经按照Html的格式被编码,编码后的URL是http://www.&#32321;&#20307;&#20013;&#25991;.google.com

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

繁  —> &#32321;

  主要格式是 "&#" + 一个十进制数 + ";",而这个十进制数正是汉字"繁"的中文内码。"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宽字符,再将'&#32321;'替换为此宽字符,这样即可。

    遍历一遍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中,代替原来的&#32321;
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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JSON中不能加注释

      今天犯了一个白痴级的错误,那就是向JSON数据文件中,很多行后面添加注释(Comment,//)。   导致Node.js程序不能读取JSON文件,Serv...

    宋凯伦
  • 【工作中学习1】两个设计模式:Singleton(单例)和 Adapter(适配器)

      好久没有写自己的学习小文章,罪过罪过。。最近本菜鸟在项目中接触到经常用到的设计模式,首先是Singleton(单例),这个相信大家都会用到很多,所以自己用代...

    宋凯伦
  • 【Angular JS】正确调用JQuery与Angular JS脚本 - 修复Warning: Tired to load angular more than once

      自己正在做一个小网站,使用Angular JS + Express JS + Mongo DB,在开发过程中,遇到一些问题,所以整理出来。希望对大家都有帮助...

    宋凯伦
  • 精述字符编码

    带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK...

    Dabelv
  • python编码问题

    我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。

    bear_fish
  • Unicode,ASCII,UTF-8的区别

    ---------------------------------------------------- 作者:JamesHH 链接:https://www...

    smy
  • 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念

    一切的谜都解开了!在写这篇随笔之前,我的心情只能用金田一每次破案后的这句台词来表达。

    哲洛不闹
  • 我也打算去摆摊

    真的,我也打算去摆摊,宣传语我都想好了。沉默王二,一枚有颜值却靠才华苟且的程序员,《Web 全栈开发进阶之路》作者,CSDN 明星博主,周排名第 4,总排名 4...

    沉默王二
  • SpringCloud微服务实战(四)-微服务中的服务拆分

    JavaEdge
  • 11-9小程序新能力

    11月9日发布的小程序新能力,其实在技术上没什么特点,就不做解读了,后头应该有更劲爆的。 “ 为帮助开发者快速推广小程序,公众号文章底部广告位现已支持推广小程序...

    花叔

扫码关注云+社区

领取腾讯云代金券