A-A+

含有中文的网址中显示百分号%等乱码是什么?

2008年11月29日 编程开发 暂无评论 阅读 1 次

在浏览一些网址中,我们可以看到这样一些特别的现象,就是网址中会出现一些百分号(%)和一字母数字组成的让我们看不明白的乱码,这究竟是怎么回事,它们又都是些什么东西呢?

其实,这里由%和数字字母组成的有规律性的“乱码”它们并不真是乱码,它们是一种特殊的编码,有电脑基础的人就知道,计算机它是不认得中文汉字的,要让计算机认识这些编码必须要转换成一些字母和数字等组成的代码。

事实上,我们在浏览器地址栏中看到的由%号和字母数字组成的乱码,我们可以发现它们有一些规律,即都是三个字符一组,排在最前面的肯定是百分号%。它们不是什么乱码,它们其实是UTF-8编码或者gbk(GB2312)编码,那些百分号(%)后面的数字和字母其实就是16进制数。

中文的gbk(GB2312)编码

如果是中文的gbk(GB2312)编码,那么它的形式应该是这样的,即一个汉字对应两组%xx,即%xx%xx,比如http://www.baidu.com/baidu?tn=baidu&word=%D6%D0%B9%FA 这个网页地址是百度的,百度是使用GB2312编码的,这个网址中我们可以看到的特殊代码是“%D6%D0%B9%FA”,其中前面的“%D6%D0”就对应中文汉字“中”字,后面的“%B9%FA”就对应中国汉字“国”字。

中文的UTF-8编码

如果是中文的UTF-8编码,那么它的形式应该是这样的,即一个汉字对应三组%xx,即%xx%xx%xx,比如http://www.21nw.com/tag/%e7%bd%91%e6%b0%91 ,这个网址是本站21nw.com的网页,21nw使用的是UTF-8编码,这个网址中的”%e7%bd%91%e6%b0%91″对应着中文汉字“网民”,即“%e7%bd%91”对应汉字“网”,“%e6%b0%91”对应中文汉字“民”。

再看个例子

http://www.google.cn/search?q=%BA%BA%D7%D6&ie=GB2312&oe=GB2312&hl=zh-CN
http://www.google.cn/search?complete=1&hl=zh-CN&q=%E6%B1%89%E5%AD%97&meta=&aq=null

上面这两个地址在浏览器中都会显示谷歌关于关键词“汉字”的搜索结果网页,只不过前面的一个是GB2312网页,后面一个是UTF-8编码网页,我们可以很明显的看出它们中“乱码”的区别。

为什么要使用这样的编码?

这是为了兼容一些设备,有些设备只能传ASCII码,只认识128个字符,不认识汉字。

 

在gbk(GB2312)中,一个汉字编码对应%xx%xx,即两组百分号和16进制数;而UTF-8对应%xx%xx%xx,三组百分号和16进制数,下面就是汉字与16进制的相互转换,当然其他语言也可以转换成16进制
c#中,
using System.Text;
 
// x赋为一个汉字(根据需要GB2312可以改成UTF-8)
Byte[] textByte = System.Text.Encoding.GetEncoding("GB2312").GetBytes(x);
 
// 上面这句就可以得到二维数组,再代入到下面的代码中
 
                StringBuilder Text = new StringBuilder();
                for (int j = 0; j < textByte.Length; j++)
                {
                    // Tochar
                    char textChar = Convert.ToChar(int.Parse(textByte[j].ToString()));
                    // To16
                    Text.Append(System.Uri.HexEscape(textChar));
                }
最后就可以求得x的16进制值=Text.ToString();   此结果自动包含百分号。例:x="我"; 转换结果为%CE%D2
 
大多数情况下,你需要的是把网址转换成汉字,参照上面可做出逆程序:
   string txt ="%CE%D2%CA%C7";// "我是"的国标编码
   string[] x = this.txt.Split('%');// 按百分号分组
   string word = "";// 最后想得到的值
   string one="";// 转换后的单个汉字
   int y = 0;// ref 自增用
 
   // 如果转换成国标GB2312即%xx%xx,typelength设成2;如果转换成utf8即%xx%xx%xx,typelength设为3
   int typelength = 2;
   byte[] textByte = new byte[typelength];
 
   for(int i = 1;i<x.Length;i++)
   {
                int j = (i - 1) % typelength;
                // To char
                char textChar = System.Uri.HexUnescape(txt, ref y);
                // 比上面的程序多一步To byte
                textByte[j] = Convert.ToByte(textChar);
                // 一组编码的最后一组百分号和16进制数
                if (j == typelength-1)               
                {
                    // To 汉字
                    one = System.Text.Encoding.GetEncoding("GB2312").GetString(textByte);
                    // 所有的汉字拼起来
                    word = word + one;
                }
   }

 

给我留言

Copyright © 浩然东方 保留所有权利.   Theme  Ality 07032740

用户登录