最近在编程做一个Web Service已提供给自己的应用程序以分析后百度的搜索结果,要取得百度的搜索结果就要生成其搜索URL,最主要的问题在于汉字的编码,下面我找到的一些资料和心得.
在PC机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个字节:第一个字节为区码,为了与ASCII码区别,范围从十六进制的0A1H开始(小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位码,范围也是从0A1H开始,对应某区中的第一个位码。这样,将汉字机内码减去0A0AH就得该汉字的区位码。
例如汉字“房”的机内码为十六进制的“B7BF”,其中“B7”表示区码,“BF”表示位码。所以“房”的区位码为0B7BFH-0A0A0H=171FH。将区码和位码分别转换为十进制得汉字“房”的区位码为“2331”,即“房”的点阵位于第23区的第31个字的位置,相当于在文件HZK16中的位置为第32×[(23-1) ×94+(31-1)]=67136B以后的32个字节为“房”的显示点阵。
baidu和yisou的编码方式是安下面的方法编码的:
url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上"%"。比如"",它的ascii码是92,92的十六进制是5c,所以""的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:"胡"的ascii码(区位码?)是-17670,十六进制是BAFA,url编码是"%BA%FA"。
针对百度,总结如下:
1,不需要编码的是: 大小写字母,减号和英文句点.
2,空格转化为+号,是相与操作.
3,汉字按'gb2312'编码,每字符对应二个字节.
4,特殊符号编码后占用一个字节.
用C#编了个函数如下:
public string CharacterToCoding(string character)
{
string coding = "";
string lowCode = "";
string highCode = "";
const string PRE = "%";
for (int i = 0; i < character.Length; i++)
{
byte[] bytes = System.Text.Encoding.Default.GetBytes(character.Substring(i, 1));
if(bytes[0]>128){ //大于80H,是汉字
lowCode = System.Convert.ToString(bytes[0], 16);
highCode = System.Convert.ToString(bytes[1], 16);
coding += (PRE + lowCode + PRE + highCode);
}
else if ((bytes[0] > 96 && bytes[0] < 123) || (bytes[0] > 64 && bytes[0] < 91)){ //是字母
coding += character.Substring(i, 1);
}
else if ( (bytes[0]>47 && bytes[0]<58) || (bytes[0]==45) || (bytes[0]==46) ){ //是数字或减号或英文句点
coding += character.Substring(i, 1);
}else if (bytes[0]==32){ //是空格
coding += "+";
}else{
coding += (PRE + System.Convert.ToString(bytes[0], 16) );
}
}
return coding;
}
还没有处理连续的空格,有什么问题请大家拍砖!