精华内容
下载资源
问答
  • 主要介绍了IOS 解决URL中文乱码问题解决方案的相关资料,需要的朋友可以参考下
  • URL汉字编码问题(及乱码解决)
  • 介绍了java中url汉字编码互相转换实例,有需要的朋友可以参考一下
  • URL汉字编码问题以及乱码解决

    万次阅读 2018-01-18 11:57:55
    一、问题的由来 URL就是网址,只要上网,就一定会用到。一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址 “http://www.abc.com”,但是没有希腊...

    一、问题的由来

    URL就是网址,只要上网,就一定会用到。

    一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址 “http://www.abc.com”,但是没有希腊字母的网址“http://www.aβγ.com”(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738 做了硬性规定:

    "...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

    “只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于 URL。”

    这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。

    下面就让我们看看,“URL编码”到底有多混乱。我会依次分析四种不同的情况,在每一种情况中,浏览器的URL编码方法都不一样。把它们的差异解释清楚之后,我再说如何用Javascript找到一个统一的编码方法。

    二、情况1:网址路径中包含汉字

    打开IE(我用的是8.0版),输入网址“http://zh.wikipedia.org/wiki/春节 ”。注意,“春节”这两个字此时是网址路径的一部分。

    bg2010021102.jpg

    查看HTTP请求的头信息,会发现IE实际查询的网址是“http://zh.wikipedia.org/wiki/%E6%98%A5%E8%8A%82 ”。也就是说,IE自动将“春节”编码成了“%E6%98%A5%E8%8A%82”。

    bg2010021103.png

    我们知道,“春”和“节”的utf-8编码分别是“E6 98 A5”和“E8 8A 82”,因此,“%E6%98%A5%E8%8A%82”就是按照顺序,在每个字节前加上%而得到的。

    在Firefox中测试,也得到了同样的结果。所以,结论1就是,网址路径的编码,用的是utf-8编码。

    三、情况2:查询字符串包含汉字

    在IE中输入网址“http://www.baidu.com/s?wd=春节 ”。注意,“春节”这两个字此时属于查询字符串,不属于网址路径,不要与情况1混淆。

    bg2010021104.jpg

    查看HTTP请求的头信息,会发现IE将“春节”转化成了一个乱码。

    bg2010021105.png

    切换到十六进制方式,才能清楚地看到,“春节”被转成了“B4 BA BD DA”。

    bg2010021106.png

    我们知道,“春”和“节”的GB2312编码(我的操作系统“Windows XP”中文版的默认编码)分别是“B4 BA”和“BD DA”。因此,IE实际上就是将查询字符串,以GB2312编码的格式发送出去。

    Firefox的处理方法,略有不同。它发送的HTTP Head是“wd=%B4%BA%BD%DA”。也就是说,同样采用GB2312编码,但是在每个字节前加上了%。

    bg2010021107.png

    所以,结论2就是,查询字符串的编码,用的是操作系统的默认编码。

    四、情况3:Get方法生成的URL包含汉字

    前面说的是直接输入网址的情况,但是更常见的情况是,在已打开的网页上,直接用Get或Post方法发出HTTP请求。

    根据台湾中兴大学吕瑞麟老师的试验 ,这时的编码方法由网页的编码决定,也就是由HTML源码中字符集的设定决定。

      <meta http-equiv="Content-Type" content="text/html;charset=xxxx">

    如果上面这一行最后的charset是UTF-8,则URL就以UTF-8编码;如果是GB2312,URL就以GB2312编码。

    举例来说,百度是GB2312编码,Google是UTF-8编码。因此,从它们的搜索框中搜索同一个词“春节”,生成的查询字符串是不一样的。

    百度生成的是%B4%BA%BD%DA,这是GB2312编码。

    bg2010021109.jpg

    Google生成的是%E6%98%A5%E8%8A%82,这是UTF-8编码。

    bg2010021108.jpg

    所以,结论3就是,GET和POST方法的编码,用的是网页的编码。

    五、情况4:Ajax调用的URL包含汉字

    前面三种情况都是由浏览器发出HTTP请求,最后一种情况则是由Javascript生成HTTP请求,也就是Ajax调用。还是根据吕瑞麟老师的文章,在这种情况下,IE和Firefox的处理方式完全不一样。

    举例来说,有这样两行代码:

      url = url + "?q=" +document.myform.elements[0].value; // 假定用户在表单中提交的值是“春节”这两个字

      http_request.open('GET', url, true);

    那么,无论网页使用什么字符集,IE传送给服务器的总是“q=%B4%BA%BD%DA”,而Firefox传送给服务器的总是“q=%E6%98 %A5%E8%8A%82”。也就是说,在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。这就是我们的结论4。

    六、Javascript函数:escape()

    好了,到此为止,四种情况都说完了。

    假定前面你都看懂了,那么此时你应该会感到很头痛。因为,实在太混乱了。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。如果程序员要把每一种结果都考虑进去,是不是太恐怖了?有没有办法,能够保证客户端只用一种编码方法向服务器发出请求?

    回答是有的,就是使用Javascript先对URL编码,然后再向服务器提交,不要给浏览器插手的机会。因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。

    Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起。

    实际上,escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如“春节”的返回结果是%u6625%u8282,也就是说在Unicode字符集中,“春”是第6625个(十六进制)字符,“节”是第8282个(十六进制)字符。

    bg2010021110.png

    它的具体规则是,除了ASCII字母、数字、标点符号“@ * _ + - . /”以外,对其他所有字符进行编码。在\u0000到\u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式。对应的解码函数是 unescape()。

    所以,“Hello World”的escape()编码就是“Hello%20World”。因为空格的Unicode值是20(十六进制)。

    bg2010021111.png

    还有两个地方需要注意。

    首先,无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。也就是说,Javascipt函数的输入和输出,默认都是Unicode字符。这一点对下面两个函数也适用。

    bg2010021112.png

    其次,escape()不对“+”编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。

    七、Javascript函数:encodeURI()

    encodeURI()是Javascript中真正用来对URL编码的函数。

    它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号“; / ? : @ & = + $ , #”,也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。

    bg2010021113.png

    它对应的解码函数是decodeURI()。

    bg2010021114.png

    需要注意的是,它不对单引号'编码。

    八、Javascript函数:encodeURIComponent()

    最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。

    因此,“; / ? : @ & = + $ , #”,这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。

    bg2010021115.png

    它对应的解码函数是decodeURIComponent()。

    PS1

    网页里的form编码其实不完全取决于网页编码,form标记中有一个accept-charset属性,在非ie浏览器种,如果将其赋值(比如 accept-charset="UTF-8"),则表单会按照这个值表示的编码方式进行提交。 在ie下,我的兼容解决办法是: form1.οnsubmit=function(){ document.charset=this.getAttribute('accept-charset'); }

    PS2 :字符编码笔记:ASCII,Unicode和 UTF-8

    1. ASCII码

    我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 0000000到11111111。

    上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

    ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制 01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

    2、非ASCII编码

    英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。

    但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。

    至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。

    中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和 UTF-8是毫无关系的。

    3.Unicode

    正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

    可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

    Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母 Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org  ,或者专门的汉字对应表

    4. Unicode的问题

    需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

    比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

    这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

    它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode 在很长一段时间内无法推广,直到互联网的出现。

    5.UTF-8

    互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF- 16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

    UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

    UTF-8的编码规则很简单,只有二条:

    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

    2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

    下表总结了编码规则,字母x表示可用编码的位。

    Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    下面,还是以汉字“严”为例,演示如何实现UTF-8编码。

    已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是 “11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

    6. Unicode与UTF-8之间的转换

    通过上一节的例子,可以看到“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。它们之间的转换可以通过程序实现。

    在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。

    bg2007102801.jpg

    里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8。

    1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

    2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。

    3)Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。

    4)UTF-8编码,也就是上一节谈到的编码方法。

    选择完”编码方式“后,点击”保存“按钮,文件的编码方式就立刻转换好了。

    7. Little endian和Big endian

    上一节已经提到,Unicode码可以采用UCS-2格式直接存储。以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

    这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big- Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。

    因此,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。

    那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?

    Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

    如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

    8. 实例

    下面,举一个实例。

    打开”记事本“程序Notepad.exe,新建一个文本文件,内容就是一个”严“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

    然后,用文本编辑软件UltraEdit中 的”十六进制功能“,观察该文件的内部编码方式。

    1)ANSI:文件的编码就是两个字节“D1 CF”,这正是“严”的GB2312编码,这也暗示GB2312是采用大头方式存储的。

    2)Unicode:编码是四个字节“FF FE 25 4E”,其中“FF FE”表明是小头方式存储,真正的编码是4E25。

    3)Unicode big endian:编码是四个字节“FE FF 4E 25”,其中“FE FF”表明是大头方式存储。

    4)UTF-8:编码是六个字节“EF BB BF E4 B8 A5”,前三个字节“EF BB BF”表示这是UTF-8编码,后三个“E4B8A5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。

    9. 延伸阅读

    * The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets  (关于字符集的最基本知识)

    * 谈谈Unicode编码

    * RFC3629:UTF- 8, a transformation format of ISO 10646 (如果实现UTF-8的规定)

    展开全文
  • 主要为大家分享了介绍了java中文乱码之解决URL中文乱码问题的方法,感兴趣的小伙伴们可以参考一下
  • 解决URL地址中的中文乱码问题的办法 引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息。乱码问题就此产生了,该如何解决...
  • js解决url中文乱码问题

    万次阅读 2019-02-19 17:02:10
    在日常开发当中,我们可能遇到要将某个页面的参数通过url链接拼接的方式传递到另一个页面当中,在另一个页面当中进行使用,如果传输过去的是中文,那么可能会遇到中文乱码问题,那么该如何来解决呢?     ...

    在日常开发当中,我们可能遇到要将某个页面的参数通过url链接拼接的方式传递到另一个页面当中,在另一个页面当中进行使用,如果传输过去的是中文,那么可能会遇到中文乱码问题,那么该如何来解决呢?

     

     

     

     

     

    <!--test01.html-->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
    </head>
    <body>
    
    <div id="userName">你好明天</div>
    
    <div οnclick="send();">点击测试</div>
    
    <script>
        function send(){
            var url = "test02.html";
            var userName = $("#userName").html();
    //        window.open(encodeURI(url + "?userName=" + userName));     //encodeURI针对整个参数进行编码
            window.open(url + "?userName=" + encodeURIComponent(userName));  //encodeURIComponent针对单个参数进行编码
    
        }
    </script>
    
    </body>
    </html>

     

     

    <!--test02-->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
    </head>
    
    <body>
    
    <div id="userName"></div>
    
    <script>
        var urlinfo = window.location.href;//获取url
        var userName = urlinfo.split("?")[1].split("=")[1];//拆分url得到”=”后面的参数
    //    $("#userName").html(decodeURI(userName));          //decodeURI针对整个参数进行解码
        $("#userName").html(decodeURIComponent(userName));   //decodeURIComponent针对单个参数进行解码
    //    $("#userName").html(userName);
    </script>
    
    </body>
    </html>

     

    针对中文乱码问题,最主要是通过(encodeURI,decodeURI),(encodeURIComponent,decodeURIComponent)两种方法进行参数的编码以及解码工作,其中xxxxURI最主要针对的是整个url参数,xxxxURIComponent针对的是当个url参数; 
    

    简单的分享就到这里,如有疑问,欢迎留言~

     

    展开全文
  • 在开发过程中遇到了Url中文乱码问题,经过多次测试,解决了问题,并分享给大家,希望能够你帮助!
  • ISAPI_Rewrite伪静态中文URL乱码的解决方案 细心有朋友会发现,在众多知名程序,比如ShopEx网店、Discuz论坛等系统的伪静态规则都存在中文编码问题
  • 解决springMVC中URL中文乱码问题 问题: 在java控制器里面如果转发或重定向的URL中有中文,那么请求该URL时就会造成乱码,导致访问出错。 事例 @RequestMapping("/updateBook") public String updateBook(Books ...

    解决springMVC中URL中文乱码问题

    问题:

    在java控制器里面如果转发或重定向的URL中有中文,那么请求该URL时就会造成乱码,导致访问出错。

    事例

    @RequestMapping("/updateBook")
        public String updateBook(Books books, String type, HttpServletResponse response, HttpServletRequest request) throws Exception {
            request.setCharacterEncoding("UTF-8");
            bookService.updateBook(books);
            System.out.println(books.getBookName());
            if (type.equals("ab"))
            return "redirect:all";
            else
                response.sendRedirect("/book/byName?bName=" + URLEncoder.encode(books.getBookName(),"UTF-8"));
            return null;
    
        }
    @RequestMapping("/byName")
        public String del(@RequestParam("bName") String name, Model model,HttpServletRequest request)throws Exception{
            List<Books> books = bookService.queryByName(name);
            model.addAttribute("list",books);
            model.addAttribute("name",name);
            System.out.println(books);
            return "queryByName";
        }
    
    • 这段代码是方法update通过response重定向到下面的路径(/byName,因为该类上还有一个/book的映射,此处省略),因为路径上带有参数,而且是中文,所有就会导致乱码。
      解决办法
    1. 要解决这个问题很简单,只需要将该URL编码成UTF=8格式即可
    2. 方法:URLEncoder.encode(中文,“UTF-8”)
    3. 最后将其拼接到URL即可,也可以直接将整个URL编码,此法读者可自行尝试
    展开全文
  • 从A页面通过url传参到B页面时,获取URL中参数出现中文乱码问题,解析url参数的正确方法如下,感兴趣的朋友可以参考下
  • 主要介绍了python实现中文转换url编码的方法,结合实例形式分析了Python针对中文的gbk与utf-8编码转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 解决浏览器下载中文乱码问题 中文乱码是个让人头痛的问题,这里整理针对下载时,中文乱码问题,下面是Java对应的实现,均已测试OK response.reset(); response.setContentType("application/octet-stream"); ...

    解决浏览器下载中文乱码和URL中文乱码问题

    下载中文乱码问题

    中文乱码是个让人头痛的问题,这里整理针对下载时,中文乱码问题,下面是Java对应的实现,均已测试OK

     response.reset();
                response.setContentType("application/octet-stream");
                response.setCharacterEncoding(StandardCharsets.UTF_8.name());
                // 关键代码
                String fileName = HttpUtils.encodeAttachmentName(fileResponse.getOriginFileName(), request) ;
                response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
                response.setHeader("Accept-ranges", "bytes");
    

    HttpUtils.encodeAttachmentName实现:

    public static String encodeAttachmentName(String fileName , HttpServletRequest request) {
            String enableFileName = fileName ;
            try {
                String userAgent = request.getHeader("User-Agent");
                if(StringUtils.isBlank(userAgent)){
                    enableFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()).replace("+", "%20").replace("*", "%2A").replace("~", "%7E");
                } else if (userAgent.indexOf("Firefox") > -1 ) {
                    // Firefox
                    enableFileName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(fileName.getBytes(StandardCharsets.UTF_8)))) + "?=";
                } else if (userAgent.indexOf("Safari") > -1 || userAgent.toUpperCase().indexOf("MSIE") > -1) {
                    // Safari Or IE
                    enableFileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
                } else {
                    // 其他浏览器
                    enableFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()).replace("+", "%20").replace("*", "%2A").replace("~", "%7E");
                }
            } catch (Exception e){
                LOGGER.warn("Failed To encode file name", e);
                throw new IllegalArgumentException("Failed To encode file name", e);
            }
    
            return enableFileName ;
        }
    

    注:

    1. 火狐浏览器Firefox,只支持 enableFileName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(fileName.getBytes(StandardCharsets.UTF_8)))) + "?="; 这种方式;
    2. Safari 浏览器,只支持 enableFileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)
    3. Chrome 浏览器,可以支持 enableFileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)enableFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())
    4. 其他类型的浏览器,统一使用URLEncoder.encode的方式,这种方式可保证中文时不会出现乱码情况

    URL路径中含有中文处理方式:

    public static String uriEncode(String urlPath, String encoding) {
            StringBuffer resultUri = new StringBuffer();
            String[] keys = urlPath.split("/");
            resultUri.append(urlEncode(keys[0], encoding));
            for (int i = 1; i < keys.length; i++) {
                resultUri.append("/").append(urlEncode(keys[i], encoding));
            }
            if (urlPath.endsWith("/")) {
                // String#split ignores trailing empty strings,
                // e.g., "a/b/" will be split as a 2-entries array,
                // so we have to append all the trailing slash to the uri.
                for (int i = urlPath.length() - 1; i >= 0; i--) {
                    if (urlPath.charAt(i) == '/') {
                        resultUri.append("/");
                    } else {
                        break;
                    }
                }
            }
            return resultUri.toString();
        }
    
        /**
         * Encode a URL segment with special chars replaced.
         */
        public static String urlEncode(String url, String encoding) {
            if (StringUtils.isBlank(url)) {
                return "";
            }
            try {
                String encoded = URLEncoder.encode(url, encoding);
                return encoded.replace("+", "%20").replace("*", "%2A").replace("~", "%7E").replace("/", "%2F");
            } catch (UnsupportedEncodingException e) {
                throw new IllegalArgumentException("Failed To Encode Uri", e);
            }
        }
    
    展开全文
  • 解决jq获取URL中文乱码问题

    千次阅读 2018-06-09 23:05:12
    网上的方法: function getUrlParms(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");...但是获取到的值出现中文乱码问题: 解决:把unescape()方法改为decodeURL即可解决 return decodeURL(r[2]);
  • [转]URL汉字编码问题(及乱码解决)

    千次阅读 2015-07-18 20:08:00
    一、问题的由来 URL就是网址,只要上网,就一定会用到。 一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址 “http://www.abc.com”,但是没有...
  • URL中文乱码问题

    2016-11-16 22:00:06
    URL中文乱码问题 **使用URLEncoder和URLDecoder对URL进行编码和解码来解决中文乱码** URLEncoder.encode(name,"UTF-8") //编码 URLDecoder.decode(name,"UTF-8") //解码 详细介绍:java中的URLEncoder和...
  • JSP URL 中文乱码 解决方式 请求页面 <% String name = java.net.URLEncoder.encode("中文名字","UTF-8"); name = java.net.URLEncoder.encode(name,"UTF-8"); %> url = "xxxx.action?name = <%=name...
  • 如果你安装的是IIS rewrite_2.0的话,传递的参数都是UTF-8格式的,如果你网站是GBK的就会出现中文连接乱码。 解决办法: rewrite_2.0规则写法: RewriteRule ^news_list_([0-9a-zA-Z\u4e00-\u9fa5]+)\.html$ news_...
  • 目录原因1原因2原因3(问题解决) 原因1 服务端获取数据时,获取到的就是乱码(通过debugger排除了) 原因2 前后端字符编码不一致 解决思路 ...服务端使用ModelAndView进行重定向时,发现URL中文未乱
  • Jsp request和URL中文乱码问题解决

    千次阅读 2018-06-28 16:42:04
    < ...> < head > ...测试URL传参数 ... 如果想通过URL转到request.jsp页面,发生乱码。则进入下面路径 D:\Program Files (x86)\apache-tomcat-8.0.42\conf –>> server.xml 打开,找到如下
  • 解决URL中文乱码问题

    千次阅读 2017-08-10 12:00:15
    而表单形式一般都不会出现乱码问题乱码问题主要是在URL上面。通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的...
  • JS 获取url参数以及中文乱码问题

    万次阅读 2018-10-25 16:13:07
    encodeURI() 函数可把字符串作为 URI 进行编码 获取请求url中参数 http://a.com/index.html?name=名称&amp;type=类型 var para=window.location.search;// 当前请求的url的参数部分 console.log(para) // ...
  • 1、python中的urlencode与urldecode ...4、如何只对url中的中文编码 5、[python]——关于中文字串与URL编码之间的转化 6、python中unicode、utf8、gbk等编码问题 转载于:https://www.cnblo...
  • 主要介绍了PHP基于curl post实现发送url及相关中文乱码问题解决方法,结合具体实例形式分析了php使用curl实现post数据发送及content-type相关设置操作技巧,需要的朋友可以参考下
  • //扩展方法获取url参数 $.getUrlParam = function (name) { var reg = new RegExp("(^|&amp;)" + name + "=([^&amp;]*)(&amp;|$)"); //构造一个含有目标参数的正则表达式对象 ...
  • 目前大部分的网站,都是使用的UTF-8编码。例如发送一段二进制到服务器时,服务器规定该二进制内容的编码...附件是GB18030包含的21004个汉字的GB18030编码、Unicode编码URL编码对照表,可用于解决中文乱码转换恢复。
  • 解决URL中文参数乱码问题及原理

    万次阅读 2018-09-05 12:18:56
    在前台,对URL中文参数执行两次encodeURI: var param = encodeURI(encodeURI("中文")); 后台取数据时使用 URLDecoder进行解码: String param = (String)request.getParameter("param"...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,637
精华内容 77,454
关键字:

url中文编码