URI解析非英文的问题

来源:互联网 发布:武汉旅游 知乎 编辑:程序博客网 时间:2024/05/03 16:14

之前看到一个tester提交的代码修了一个处理URI解析的问题,其中有一步是想得到一个传入的uri的绝对路径,当然之前的代码理所当然地用了uri.AbsoluteUri来取值,这个当然没有问题。但是,localization的问题又来了,现在的场景是传入了一个非EN的path,比如:

 

 

string local = @"E:/サwォ’アフィ.xt", 然后在debug时看到的信息是这样的:

 

 -  uri {file:///E:/サwォ’アフィ;txt} System.Uri
  AbsolutePath "E:/%E3%82%B5%EF%BD%97%E3%82%A9%E2%80%99%E3%82%A2%E3%83%95%E3%82%A3;txt" string
  AbsoluteUri "
file:///E:/%E3%82%B5%EF%BD%97%E3%82%A9%E2%80%99%E3%82%A2%E3%83%95%E3%82%A3;txt" string

 

 

很明显,这里的日文字符作了编码,所以才看到了%**。 当然,现在的代码是用了uri.ToString()直接得到uri的全部内容,到目前为止这个tester没有想到除此以外的方法 =)

 

不过针对这点,作了一个小调查,即为什么uri在AbsolutePath/AbsoluteUri得不到预期的内容?

 

http://en.wikipedia.org/wiki/URI_encoding#Types_of_URI_characters 里面可能会有一些启示,大致的意思是uri会有2种percent-encoding的方式,reserved模式是针对一些特殊字符的,比如!·##¥,etc;

unreserved模式则是针对除此以外的字符,比如一些unicode的东西。所以看到%**是一种dy design的现象,所以C#的URI得到的是编码后的结果。

 

 

这个小问题给出的启示是:有时候会忽略本地化的问题,不管是开发还是测试都是如此。当然在作测试时候,特别那些接受输入时候api,请试试一些中文(unicode), 说不定你的api 就有问题了。