问题描述:
用c#写了一个小程序,用来抓取网页,当网页编码单一时,可以正常,当抓取目标页面存在多个编码时(如果中文和繁体共存),就会出现部分字符转义,如(语言工具:语言工具),虽然源码被转义成#&xxxxx形式,但是IE显示还是正常显示的。
出现问题,想办法解决吧。
首先需要确定#&xxxxx形式的编码到底是什么东东,从网上搜索了很多资料,都是关于乱码的解决方案,没有关于#&xxxxx方面的信息。
很是纳闷,#&xxxxx形式的编码肯定不是乱码,因为它能正常显示字符,可是它到底是什么呢,怎么能给它逆转到正常字符呢。
浪费了近一周的时间,真想放弃。
无助时,联系了北京朋友来探讨这一问题,还是朋友有耐心,帮我查到#&xxxxx其实是字符的unicode内码。
知道这个情况后,就好办多了。不过怎么能将unicode内码转回字符呢,这可又范愁了,从网上搜索了N多资料,没有结果。不过找到了类似javascript解决unicode内码的问题,我当时没有看它是怎么实现的,因为考虑了一下,.net通过javascript来转换内码,浪费性能,不太现实(因为我的字符集非常大)。
朋友又给我发了N个语言的unicode的内码库,我看了部分,有的库太大,还没打开都死机了,如果通过这种方式来批量查找替换内码,更是不现实。
快下班时,朋友给发了EMAIL,说是找到了javascript能解决这一问题,我只看了下标题,不想往下看,因为这块我以前也注意过,应当解决不了问题。
在关闭邮件的同时,忽然想到,是否可以借鉴下javascript,看它是如果转换的,我不相信它能解决的问题.net无能为力?
打开javascript函数,一看,恍然大悟,真是简单问题复杂化了,浪费了我近两周的时间研究这个小问题:
javascript实现办法:
<script>
function unicode(s){
var len=s.length;
var rs="";
for(var i=0;i<len;i++){
var k=s.substring(i,i+1);
rs+="&#"+s.charCodeAt(i)+";";
}
return rs;
}
function runicode(s){
var k=s.split(";");
var rs="";
for(i=0;i<k.length;i++){
var m=k.replace(/&#/,"");
rs+=String.fromCharCode(m);
}
return rs;
}
alert(unicode("老韩测试"));
</script>
function unicode(s){
var len=s.length;
var rs="";
for(var i=0;i<len;i++){
var k=s.substring(i,i+1);
rs+="&#"+s.charCodeAt(i)+";";
}
return rs;
}
function runicode(s){
var k=s.split(";");
var rs="";
for(i=0;i<k.length;i++){
var m=k.replace(/&#/,"");
rs+=String.fromCharCode(m);
}
return rs;
}
alert(unicode("老韩测试"));
</script>
由上可知,javascript通过函数fromCharCode就可以实现转换,.net里有类似对应的类型:char。
转换很简单,一句话解决问题:
char a = (char)35821;
Response.Write(a.ToString());
Response.Write(a.ToString());
OK,知道原理后,就可以写程序批量获取被转义的字符来转换了。
经过此事,打击不小,不过还好没有放弃。




问题集锦





此内容无附件