.net6环境下RestSharp获取gbk网页乱码的解决方案
public iactionresult gethipda() { cookies = @"__utmz=128828693.1622702936.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); cdb_cookietime=2592000; cdb_auth=fd05acwp2gizl8k0oqbazutq8wjxixixeseqpdsfazikxex4tydjm%2b4fibry7jxlygqs0yjp3k2kgfk6mfe6fcjkrih5; smile=1d1; discuz_fastpostrefresh=0; __utmc=128828693; cdb_visitedfid=2d6; cdb_sid=0zwkq7; __utma=128828693.1700824799.1622702936.1623767772.1623808037.73; __utmt=1; __utmb=128828693.1.10.1623808037; checkpm=1"; string url = @"https://www.hi-pda.com/forum/forumdisplay.php?fid=2"; var client = new restclient(url); var request = new restrequest(); request.addheader("cookie", cookies); var response = client.get(request); encoding.registerprovider(codepagesencodingprovider.instance); var data=httputility.urldecode(response.rawbytes, encoding.getencoding("gbk")); return content(data); }
引入nuget包:system.text.encoding.codepages
clr中的encoding就是用于字节和字符之间的转换的。
clr中的encoding是在system.text命名空间下的,它是一个抽象类(abstract class), 所以不能被直接实例化,它主要有如下的派生类:asciiending,unicodeencoding,utf32encoding,utf7encoding,utf8encoding,你可以根据需要选择一个合适的encoding来进行编码和解码。你也可以调用encoding的静态属性ascii,unicode,utf32,utf7,utf8,来构造一个encoding。其中unicode是表示16位encoding。调用静态属性和实例化一个子类的效果是一样的,如下代码。
1 encoding encodingutf8 = encoding.utf8;
2 encoding encodingutf8 = new utf8encoding(true);
以下是这些类型的一些简单描述:
ascii编码 将16位字符编码成ascii码,只能转换值小于ox0080的16字符,并且被转换成单字节,就是说一个字符对应一个字节。当字符都在ascii范围(0x00~0x7f)内时,可以用这种编码,它的速度非常快,适合于英美地区的字符。这种编码非常有限,汉字会被转换成乱码。在clr对应asciiendoing。
utf-16 每个字符编码成2个字节,它不会对字符产生任何影响,也不会涉及到压缩处理,性能非常好,因为clr中的字符也是16位的unicode。在clr中对应unicodeencoding。
utf-32 使用4个字节编码成一个字符。从内存角度上讲,它并不是一种高效能的编码方案,因为第个字符都是4个字节,特别占内存,所以很少用来做文件和网络流的编码解码。在clr中对应utf32encoding。
utf-8 值在ox0080之下的字符压缩成一个字符,也就是ascii码;值在0x0080---0x07ff之间的字符都转换成2个字符,适合用于欧洲和中东地区。0x0800以上被转换成3个字符,适合于东亚地区的字符。代理项被转换成4个字节。因此,它是一种非常流行的编码,适用于互联网。它在处理0x0800以上的字符效率不好utf-16。在clr中对应utf8encoding。
utf-7 这咱编码通常用于旧的系统,那时的系统是用7位值表示。目前已经被unicode协淘汰。在clr中对应utf7encoding。
————————————————
下一篇: 揭秘:能跟吕布抗衡的蜀汉名将数得出几位?