0112 URI URL UTF-8

如果IE访问搜索MP3:
http://mp3.baidu.com/m?f=ms&rn=&tn=baidump3&ct=134217728&word=上海滩&lm=-1
显示内容正确,
http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word=%C9%CF%BA%A3%CC%B2&lm=-1
上海滩 三个 汉字转化为 %C9%CF%BA%A3%CC%B2
其中 C9 CF BA A3 等就是 上海 十六进制 编码。

可是IE此时已经设置
[总是以UTF-8发送URL(需重启)]:指定是否使用 UTF-8。 UTF-8 是一种定义字符的标准,目的是让这些字符能在任何语言的系统下正确显示。这个标准允许您交换包含任何语言字符的 Internet 地址 (URL)。

代码测试
Trace.WriteLine(BitConverter.ToString(Encoding.UTF8.GetBytes("上海滩")));
输出:E4-B8-8A-E6-B5-B7-E6-BB-A9

此时读取页面:
http://mp3.baidu.com/m?f=ms&rn=&tn=baidump3&ct=134217728&word=上海滩&lm=-1

<input class=formfont size=42 value="涓婃捣婊" name=word>&nbsp;<input type=submit value=百度搜索>

http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word=%C9%CF%BA%A3%CC%B2&lm=-1
<input class=formfont size=42 value="上海滩" name=word>&nbsp;<input type=submit value=百度搜索>

说明如此编码产生了乱码,而 涓婃捣婊 这四个字就是十六制 E4-B8-8A-E6-B5-B7-E6-BB-A9

如果:
Byte[] bb = System.Text.Encoding.GetEncoding("gb2312").GetBytes("上海滩");
string s = BitConverter.ToString(bb);
s="%"+s.Replace("-", "%");
Trace.WriteLine(s);

再组装进去就OK。

BAIDU.COM也是同样的问题
getPage("http://www.baidu.com/s?ie=gb2312&bs=HexEscape&sr=&z=&cl=3&f=8&wd=上海滩&ct=0");
getPage("http://www.baidu.com/s?ie=gb2312&bs=HexEscape&sr=&z=&cl=3&f=8&wd=%C9%CF%BA%A3%CC%B2&ct=0");

这样的话就非常讨厌了

提供统一资源标识符 (URI) 的对象表示形式和对 URI 各部分的轻松访问。

URI 是 Internet 上可由应用程序使用的资源的简洁表示形式。Uri 类定义了属性和方法来处理 URI,包括分析、比较和组合。Uri 类属性是只读的,修改 Uri 实例需使用 UriBuilder 类。

Uri 类只存储绝对 URI(例如“http://www.contoso.com/index.htm”)。相对 URI(例如“/new/index.htm”)必须相对于基 URI 展开,这样才是绝对的。提供了 MakeRelative 方法在必要时将绝对 URI 转换为相对 URI。

如果 URI 字符串是格式正确的 URI 并且包括包含转义序列的方案标识符,Uri 构造函数将不会转义 URI 字符串。构造函数将转义包含百分号 (%) 的相对 URI 字符串。

URI 由转义编码存储为规范化 URI,所有 ASCII 值大于 127 的字符都被替换为它们的等效十六进制数。为使 URI 具有规范化格式,Uri 构造函数执行以下步骤。

将 URI 方案转换为小写。
将主机名转换为小写。
移除默认端口号和空端口号。
移除多余的段(如“/”和“/test”段)以简化 URI。
使用 ToString 方法,可以将 Uri 类的内容从转义编码的 URI 引用转换为可读的 URI 引用。

一些 URI 包括段标识符或查询。段标识符是 URI 中跟在数字符号 (#) 后的任何文本,存储在 Fragment 属性中。查询信息是 URI 中跟在问号 (?) 后的任何文本,存储在 Query 属性中。

注意   URI 类支持使用以下格式的 IP 地址:四组表示法的 IPv4 协议和冒号分隔的十六进制 IPv6 协议。请记住在 IPv6 地址两边括上方括号,如 http://[::1]。
获取或设置 Transfer-encoding HTTP 标头的值。

[Visual Basic]
Public Property TransferEncoding As String

原创文章,转载请注明: 转载自YippeeSoft开心软件

本文链接地址: 0112 URI URL UTF-8 Transfer-encoding

历史博文

标签:,