none
如何将地址栏的内容变换编码! RRS feed

  • 问题

  •  

    大虾:

     

       我在C#里面需要在显示的时候将地址栏的地址进行编码,我用Server.htmlEncode(str)时就会显示完整正确的地址位置,附件也能够打开,但是如果换成server.UrlEncode(str)时,地址栏的编码却是变了,但是我的附件文件也打不开了,因为地址路径不对。例如:用Server.htmlEncode(str)时,地址栏为:http://xxx/file/xxx/xxx.xls  但是如果用server.UrlEncode(str)  地址栏就变成:http://当前该页面程序所在的位置/2%file%xxx.xls但是,文件也打不开,请问如何解决啊,什么问题?谢谢!

    2009年1月13日 8:43

答案

  •  

    一般只对文件名(不含扩展名)进行编码的,其他路径不用编码,除非文件夹是中文的
    2009年1月13日 12:18
    版主
  •  

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    只编码里面的中文,

     

    你现在编码的是Gb2312,不是UTF8编码,地址应当默认应当是utf-8编码的,

     

    天朗明居天麟第的utf-8编码是:

    %E5%A4%A9%E6%9C%97%E6%98%8E%E5%B1%85%E5%A4%A9%E9%BA%9F%E7%AC%AC

     

    Gb2312编码是:

    %CC%EC%C0%CA%C3%F7%BE%D3%CC%EC%F7%EB%B5%DA

     

    如何编码成utf-8?

     

     

    Response.Write(HttpUtility.UrlEncode("天朗明居天麟第",System.Text.Encoding.UTF8));
    2009年1月14日 9:20
    版主
  •  bigertiger 写:

     Cat Chen 写:
    UrlEncode是對的,HtmlEncode跟URL半點關係都沒有。至於打不開,應該是服務器的配置問題,使得服務器不接受你編碼後的URL。把一個編碼前的URL和一個編碼後的URL發上來看看吧。

     

    这是我用Server.HtmlEncode 显示并可以打开附件的地址:

     

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    这是我用Server.UrlEncode转换后不能打开附件的地址:

     

    http://localhost:2216/Pages/Project/DocUpload/%2fFile%2fBZ0001%2f%cc%ec%c0%ca%c3%f7%be%d3%cc%ec%f7%eb%b5%da%2fSA08AC5000051%b1%ea%b5%c4%c3%fb%b3%c61/%b9%e6%bb%ae%ce%c4%b5%b5.doc

     

    对比了一下,好像前面竟然多了我当前页面程序所在的目录,奇怪

     

     

    你传给UrlEncode的是"/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc",对吧?UrlEncode不至于只能到好像JavaScript的encodeURIComponent那样,知道哪些是URL中原有的英文字符,哪些是要编码的非英文字符,所以你必须将要编码的中文字符传给它,也就是"天朗明居天麟第"和"SA08AC5000051标的名称1"以及"规划文档"。

    2009年1月14日 14:17
    版主
  • 你这个只是地址编码,与显示无关啊。如果单纯只是编码地址,不会出现你说的问题。
    传递QueryString参数既可以使用utf-8,也可以使用gb2312 ,接收的时候处理一下即可。

    一般的做法:
    web.config里面request和response编码都是utf-8或者gb2312,页面不加meta设置编码,aspx也不设置
    就可以达到一致。
    2009年1月15日 3:17
    版主

全部回复

  •  

    一般只对文件名(不含扩展名)进行编码的,其他路径不用编码,除非文件夹是中文的
    2009年1月13日 12:18
    版主
  •  孟宪会 写:

     

    一般只对文件名(不含扩展名)进行编码的,其他路径不用编码,除非文件夹是中文的

     

    孟兄:

     

      请问如何处理?文件名可以不编码,但是路径是一定要变的,否则有可能给别有用心的人知道路径了就不太好。谢谢!

    2009年1月14日 1:42
  • UrlEncode是對的,HtmlEncode跟URL半點關係都沒有。至於打不開,應該是服務器的配置問題,使得服務器不接受你編碼後的URL。把一個編碼前的URL和一個編碼後的URL發上來看看吧。
    2009年1月14日 2:46
    版主
  • 楼主, server.UrlEncode 是用来传递网页地址用的, 最常见的是在url的参数中传递另外一个url地址:

    http://aaa.com/a.aspx?nexturl=[*****]

    上面的[****]是一个网站, 如果要通过url传值,则一定要首先进行server.UrlEncode 编码(注意不要用HttpUtility.UrlEncode)

     

    当我们使用Request获取参数是,会自动解码,这里一定要注意,不要再使用server.UrlDecode方法, 因为Request会自动进行一次解码.

     server.UrlEncode 会将中文以及一些url特殊符号进行编码.

     

    如果不是传递url,而是要使用url, 则不能进行server.UrlEncode编码.

     

    作为HTML显示的时候, 将数据库中读取的数据,比如地址,进行Server.htmlEncode是正确的.这样如果一个非法的地址,比如:

    http://bbb.com/<script language="javascript">****</script>

    上面这种地址直接显示在页面就会造成脚本注入攻击.

    显示前先进行Server.htmlEncode, 则页面上会原封不动的显示上面的地址,而不会将script块作为脚本处理.

    2009年1月14日 6:45
  •  Cat Chen 写:
    UrlEncode是對的,HtmlEncode跟URL半點關係都沒有。至於打不開,應該是服務器的配置問題,使得服務器不接受你編碼後的URL。把一個編碼前的URL和一個編碼後的URL發上來看看吧。

     

    这是我用Server.HtmlEncode 显示并可以打开附件的地址:

     

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    这是我用Server.UrlEncode转换后不能打开附件的地址:

     

    http://localhost:2216/Pages/Project/DocUpload/%2fFile%2fBZ0001%2f%cc%ec%c0%ca%c3%f7%be%d3%cc%ec%f7%eb%b5%da%2fSA08AC5000051%b1%ea%b5%c4%c3%fb%b3%c61/%b9%e6%bb%ae%ce%c4%b5%b5.doc

     

    对比了一下,好像前面竟然多了我当前页面程序所在的目录,奇怪

     

    2009年1月14日 7:09
  •  bigertiger 写:

     Cat Chen 写:
    UrlEncode是對的,HtmlEncode跟URL半點關係都沒有。至於打不開,應該是服務器的配置問題,使得服務器不接受你編碼後的URL。把一個編碼前的URL和一個編碼後的URL發上來看看吧。

     

    这是我用Server.HtmlEncode 显示并可以打开附件的地址:

     

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    这是我用Server.UrlEncode转换后不能打开附件的地址:

     

    http://localhost:2216/Pages/Project/DocUpload/%2fFile%2fBZ0001%2f%cc%ec%c0%ca%c3%f7%be%d3%cc%ec%f7%eb%b5%da%2fSA08AC5000051%b1%ea%b5%c4%c3%fb%b3%c61/%b9%e6%bb%ae%ce%c4%b5%b5.doc

     

    对比了一下,好像前面竟然多了我当前页面程序所在的目录,奇怪

     

     

    明显是路径不一样啊。你进行UrlEncode的时候没有计算对,/无需编码,是正确的分隔符

    2009年1月14日 8:48
    版主
  •  孟宪会 写:
     bigertiger 写:

     Cat Chen 写:
    UrlEncode是對的,HtmlEncode跟URL半點關係都沒有。至於打不開,應該是服務器的配置問題,使得服務器不接受你編碼後的URL。把一個編碼前的URL和一個編碼後的URL發上來看看吧。

     

    这是我用Server.HtmlEncode 显示并可以打开附件的地址:

     

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    这是我用Server.UrlEncode转换后不能打开附件的地址:

     

    http://localhost:2216/Pages/Project/DocUpload/%2fFile%2fBZ0001%2f%cc%ec%c0%ca%c3%f7%be%d3%cc%ec%f7%eb%b5%da%2fSA08AC5000051%b1%ea%b5%c4%c3%fb%b3%c61/%b9%e6%bb%ae%ce%c4%b5%b5.doc

     

    对比了一下,好像前面竟然多了我当前页面程序所在的目录,奇怪

     

     

    明显是路径不一样啊。你进行UrlEncode的时候没有计算对,/无需编码,是正确的分隔符

    但是我将前面不同的部分去掉,仍然是读不到附件啊

    2009年1月14日 8:52
  •  

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    只编码里面的中文,

     

    你现在编码的是Gb2312,不是UTF8编码,地址应当默认应当是utf-8编码的,

     

    天朗明居天麟第的utf-8编码是:

    %E5%A4%A9%E6%9C%97%E6%98%8E%E5%B1%85%E5%A4%A9%E9%BA%9F%E7%AC%AC

     

    Gb2312编码是:

    %CC%EC%C0%CA%C3%F7%BE%D3%CC%EC%F7%EB%B5%DA

     

    如何编码成utf-8?

     

     

    Response.Write(HttpUtility.UrlEncode("天朗明居天麟第",System.Text.Encoding.UTF8));
    2009年1月14日 9:20
    版主
  •  bigertiger 写:

     Cat Chen 写:
    UrlEncode是對的,HtmlEncode跟URL半點關係都沒有。至於打不開,應該是服務器的配置問題,使得服務器不接受你編碼後的URL。把一個編碼前的URL和一個編碼後的URL發上來看看吧。

     

    这是我用Server.HtmlEncode 显示并可以打开附件的地址:

     

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    这是我用Server.UrlEncode转换后不能打开附件的地址:

     

    http://localhost:2216/Pages/Project/DocUpload/%2fFile%2fBZ0001%2f%cc%ec%c0%ca%c3%f7%be%d3%cc%ec%f7%eb%b5%da%2fSA08AC5000051%b1%ea%b5%c4%c3%fb%b3%c61/%b9%e6%bb%ae%ce%c4%b5%b5.doc

     

    对比了一下,好像前面竟然多了我当前页面程序所在的目录,奇怪

     

     

    你传给UrlEncode的是"/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc",对吧?UrlEncode不至于只能到好像JavaScript的encodeURIComponent那样,知道哪些是URL中原有的英文字符,哪些是要编码的非英文字符,所以你必须将要编码的中文字符传给它,也就是"天朗明居天麟第"和"SA08AC5000051标的名称1"以及"规划文档"。

    2009年1月14日 14:17
    版主
  •  孟宪会 写:

     

    http://localhost:2216/File/BZ0001/天朗明居天麟第/SA08AC5000051标的名称1/规划文档.doc

     

    只编码里面的中文,

     

    你现在编码的是Gb2312,不是UTF8编码,地址应当默认应当是utf-8编码的,

     

    天朗明居天麟第的utf-8编码是:

    %E5%A4%A9%E6%9C%97%E6%98%8E%E5%B1%85%E5%A4%A9%E9%BA%9F%E7%AC%AC

     

    Gb2312编码是:

    %CC%EC%C0%CA%C3%F7%BE%D3%CC%EC%F7%EB%B5%DA

     

    如何编码成utf-8?

     

     

    Response.Write(HttpUtility.UrlEncode("天朗明居天麟第",System.Text.Encoding.UTF8));

     

    孟兄,你好!我的编码确实不是UTF-8的,用的是GB2312的,但是如果我改成了UTF-8的话,我的有些页面就会出现乱码的现象。不知道如何解决所以才换成GB2312的

    2009年1月15日 1:37
  • 你这个只是地址编码,与显示无关啊。如果单纯只是编码地址,不会出现你说的问题。
    传递QueryString参数既可以使用utf-8,也可以使用gb2312 ,接收的时候处理一下即可。

    一般的做法:
    web.config里面request和response编码都是utf-8或者gb2312,页面不加meta设置编码,aspx也不设置
    就可以达到一致。
    2009年1月15日 3:17
    版主
  •  孟宪会 写:
    你这个只是地址编码,与显示无关啊。如果单纯只是编码地址,不会出现你说的问题。
    传递QueryString参数既可以使用utf-8,也可以使用gb2312 ,接收的时候处理一下即可。

    一般的做法:
    web.config里面request和response编码都是utf-8或者gb2312,页面不加meta设置编码,aspx也不设置
    就可以达到一致。

     

    多谢孟兄的解答,还请你帮我解决一下,我的另外一个主题:IIS假死的问题,谢谢!

    2009年1月15日 5:39
  • iis 假死,要先看看事件查看器,里面报告什么。
    光从假死这2两个字面上无法进行解决
    2009年1月15日 6:19
    版主
  •  孟宪会 写:
    iis 假死,要先看看事件查看器,里面报告什么。
    光从假死这2两个字面上无法进行解决

     

    这是我的问题描述地址:

     

    http://forums.microsoft.com/china/ShowPost.aspx?PostID=4291185&SiteID=15

    2009年1月15日 8:18
  • 你好, bigertiger

    因为你的第一个问题已经解决了,所以我建议你重新开一个新帖。

    这样可以让一个帖子集中解决一个主题,也可以让你得到更多相关专家的帮助。
    2009年1月19日 3:29