`
独孤不求败
  • 浏览: 26419 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

URL地址中中文乱码详解

阅读更多
引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息。乱码问题就此产生了,该如何解决呢?且听本文详细道来。

1.  问题的引出

   在Restful的服务设计中,查询某些信息的时候,一般的URL地址设计为: get /basic/service? keyword=历史 , 之类的URL地址。 但是,在实际的开发和使用中,确是有乱码情况的发生,在后台的读取keyword信息为乱码,无法正确读取。

2. 乱码是如何产生的?



   由于我们利用URL传递参数这种方式是依赖与浏览器环境中的,也就是说URL及URL中包含的各个key=value格式的传递参数键值对参数是在浏览器地址栏中的处理原理处理相应编码后传递至后台进行解码的。

  由于我们没有进行任何处理,此时javascript请求URL并传参数存在中文时(也就是说输入框中输入中文时),对URL的中文参数进行编码是按照浏览器机制进行编码的。此时编码存在乱码问题。

3. 初次编码, javascript中利用encodeURI()方法进行编码。

   利用encodeURI()在javascript中对中文URL参数进行编码时,“测试”二字会被转换为“%E6%B5%8B%E8%AF%95”。 但是问题依然存在。原因是在编码后的字符串信息,浏览器机制会认为“%”是一个转义字符,浏览器会把地址栏URL中的传递的已转换参数“%”与“%”之间的已转义字符进行处理传递到后台中。这样会造成与实际经过encodeURI()编码后的URL不符,因为浏览器误认为“%”是转义字符字符了,它并未将“%”认为是个普通字符。
4. 二次编码,使用encodeURI
   操作: encodeURI(encodeURI("/order?name=" + name));
   处理后的URL不在是通过一次 encodeURI()转换后的字符串”%E6%B5%8B%E8%AF%95“,而是经过上一步两层encodeURI()处理URL处理后的字符串”%25E6%B255%258B%25E8%AF%2595“,通过再次编码原有被浏览起解析为转义字符的”%“被再次编码,转换成了普通字符转”%25“。
      此时前端javascript代码对带有中文的URL编码已经完成,并通过URL传递参数的方式传递到后台等待处理,Action获取到正常转换切无乱码的参数为”%25E6%B255%258B%25E8%AF%2595“,此字符串对应的中文正是我们输入的”测试“二字。
5. 后台如何正确解析中文字符信息?



  进入后台的信息,在经过二次encodeURI()之后,直接读取是无法后去正确的信息的。 需要继续如下处理:



[html] view plain copy

URLDecoder.decode("chinese string","UTF-8") 
      URLDecoder的decode(String str,String ecn)方法有两个参数,第一个参数为待解码的字符串,第二个参数为解码时的对应编码。



6.   encodeURI, encodeURIComponent, escape



    6.1  escape()函数

    escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
   返回值:已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。
   说明 :该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。不会被此方法编码的字符: @ * / +

  6.2 encodeURI() 方法

把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

6.3  encodeURIComponent() 方法

    把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。
不会被此方法编码的字符:! * ( ) '
    因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。



7. 另一种处理URL的中文乱码方案

    请求端的中字符有encodeURI进行一次转码,如:
           var url="/ajax?name="+encodeURI(name);
   服务器端代码:
        name=new String(name.getBytes("iso8859-1"),"UTF-8");
注: name为获得的字符串,iso8859-1为项目的默认字符编码,如果为中文编码gbk,gb2312等则不用这一步进行处理.

  分析: 经过程序验证,结果可行的。 由此可知,浏览器本身默认的编码方式是iso8859-1的方式,即使使用了encodeURI进行了utf-8编码处理,主要的字符串内容,比如ascii字符和可见字符都还是基于iso8859-1浏览器自身的字符。原因就是这些字符在编码上和UTF-8字符串是重合的。而encodeURI之类的转义函数主要解决,特殊字符%,/之类的字符的转义问题。

javascript中encodeURI和decodeURI方法

一、基本概念
encodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来。encodeURI方法不会对下列字符进行编码:":"、"/"、";" 和 "?",encodeURIComponent方法可以对这些字符进行编码。
decodeURI()方法相当于java.net.URLDecoder.decode(URIString, "UTF-8");
encodeURI()方法相当于java.net.URLEncoder.encode(URIString, "UTF-8");

二、例子
<script type="text/javascript">
var uriStr = "http://www.baidu.com?name=张三&num=001 zs";
var uriec = encodeURI(uriStr);
document.write("编码后的" + uriec);
var uridc = decodeURI(uriec);
document.write("解码后的" + uridc);
</script>

编码后的http://www.baidu.com?name=%E5%BC%A0%E4%B8%89&num=001%20zs

解码后的http://www.baidu.com?name=张三&num=001 zs


java jdk中说明:java.net.URLEncoder.encode(URIString, "UTF-8");

HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。有关 HTML 格式编码的更多信息,请参阅 HTML 规范。

对 String 编码时,使用以下规则:



字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
特殊字符 "."、"-"、"*" 和 "_" 保持不变。
空格字符 " " 转换为一个加号 "+"。
所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。
例如,使用 UTF-8 编码机制,字符串 "The string ü@foo-bar" 将转换为 "The+string+%C3%BC%40foo-bar",因为在 UTF-8 中,字符 ü 编码为两个字节,C3 (十六进制)和 BC (十六进制),字符 @ 编码为一个字节 40 (十六进制)。

encode

public static String encode(String s,
                            String enc)
                     throws UnsupportedEncodingException
使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。该方法使用提供的编码机制获取不安全字符的字节。
注:World Wide Web Consortium Recommendation 声明应使用 UTF-8。如果不使用该编码,可能造成不兼容性。



参数:
s - 要转换的 String。
enc - 所支持的字符编码名称。
返回:
已转换的 String。
抛出:
UnsupportedEncodingException - 如果不支持指定的编码
jdk中说明:java.net.URLDecoder.decode(URIString, "UTF-8");

HTML 格式解码的实用工具类。该类包含了将 String 从 application/x-www-form-urlencoded MIME 格式解码的静态方法。

该转换过程正好与 URLEncoder 类使用的过程相反。假定已编码的字符串中的所有字符为下列之一:"a" 到 "z"、"A" 到 "Z"、"0" 到 "9" 和 "-"、"_"、"." 以及 "*"。允许有 "%" 字符,但是将它解释为特殊转义序列的开始。

转换中使用以下规则:



字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
特殊字符 "."、"-"、"*" 和 "_" 保持不变。
加号 "+" 转换为空格字符 " "。
将把 "%xy" 格式序列视为一个字节,其中 xy 为 8 位的两位十六进制表示形式。然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。
该解码器处理非法字符串有两种可能的方法。一种方法是不管该非法字符,另一种方法是抛出 IllegalArgumentException 异常。解码器具体采用哪种方法取决于实现。

decode

public static String decode(String s,
                            String enc)
                     throws UnsupportedEncodingException
使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码。给定的编码用于确定任何 "%xy" 格式的连续序列表示的字符。
注:World Wide Web Consortium Recommendation 声明应使用 UTF-8。如果不使用该编码,可能造成不兼容性。



参数:
s - 要解码的 String
enc - 所支持的字符编码的名称。
返回:
新解码的 String
抛出:
UnsupportedEncodingException - 如果需要参考字符编码,而指定的字符编码不被支持


对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题

  request.setCharacterEncoding("utf-8");

而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:

   String str=request.getQueryString();

   //使用URLDecoder解码字符串

   String str1=java.net.URLDecoder.decode(str,"utf-8");

   String[] paraStrings=str1.split("&");

//paraStrings[0]就是第一个参数,依次类推...

   for(String paraString : paraStrings)

{

     String[] nameValue=paraString.split("=");

     //nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值

}

还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。

  String str=request.getParameter("name");

  byte[] bytes=str.getBytes("ISO-8859-1");

  String name=new String(bytes,"utf-8");


引用https://www.cnblogs.com/FrankLei/p/6741030.html
分享到:
评论

相关推荐

    详解多种方法解决MYSQ中文乱码

    在使用MySQL数据库的过程中,中文乱码问题一直是困扰很多开发者的难题。特别是在不同的服务器环境、数据库版本间迁移时,这种问题尤为突出。本文将详细介绍几种有效的方法来解决MySQL中的中文乱码问题。 #### 方法...

    Jdbc连接oracle远程数据库中文乱码解决

    Oracle数据库作为一款广泛应用的关系型数据库系统,其与Java应用程序的集成常常会遇到各种问题,其中之一就是字符编码导致的中文乱码问题。本文将深入探讨如何通过JDBC(Java Database Connectivity)连接Oracle远程...

    smartupload解决中文乱码

    这个过程中,如果编码设置不正确,就可能导致中文乱码。 解决中文乱码的关键在于正确设置字符编码。在描述中提到,"在Servlet中可以通过smart.getRequest().getParameter()直接获取",这其实是在提示我们,问题可能...

    处理中文乱码

    ### 处理中文乱码详解 #### 一、引言 在进行Web应用程序开发时,尤其是使用Java语言结合Struts框架进行开发时,中文乱码问题是开发者常常遇到的问题之一。根据给定文件的信息,本文将重点围绕Struts框架下中文乱码...

    servlet中文乱码问题

    - 这样设置后,浏览器将自动使用GBK编码来解码URL中的中文字符,从而避免乱码问题。 - **验证方法**:更改前,在IE浏览器中,选择“查看 | 编码”,可以看到“西欧(ISO)”被选中;更改后,“简体中文(GB2312)”将...

    jsp中文乱码的解决方案

    **JSP中文乱码问题详解** 在开发基于Java的Web应用程序时,JSP(Java Server Pages)页面常常会遇到中文乱码的问题。这通常发生在数据的输入、处理或输出阶段,给用户界面带来不便,也增加了开发者的调试难度。本文...

    JSP出现中文乱码问题解决方法详解.docx

    在开发过程中,JSP(JavaServer Pages)可能会遇到各种中文乱码问题,这些问题通常涉及到页面显示、URL参数传递、表单提交以及源文件编码。以下是对这些常见问题的详细解析和解决方案。 一、JSP页面中文乱码 1. ...

    Ajax 中文乱码问题

    ### Ajax 中文乱码问题详解 #### 一、引言 在进行Web开发的过程中,我们经常需要使用Ajax技术来实现异步数据交换。然而,在处理包含中文字符的数据时,经常会遇到中文乱码的问题。这个问题主要源于不同的编码方式...

    java解决解决get中文乱码问题

    ### Java解决GET请求中文乱码问题详解 在Java Web开发中,经常遇到的一个问题是处理GET请求中的中文参数时出现乱码。这个问题主要是因为浏览器发送GET请求时,参数默认使用ISO-8859-1编码格式,而服务器端通常采用...

    php url地址栏传中文乱码解决方法集合

    php地址栏传中文$_GET下来后乱码,urlencode和urldecode用法详解url编码语法: string urlencode(string str);返回值: 字符串函数种类: 编码处理例如: 复制代码 代码如下:&lt;?php$ChineseName=”我的名字,是中文的...

    JSP中文乱码处理JSP中文乱码处理

    【JSP中文乱码处理详解】 在Web开发中,JSP中文乱码是一个常见的问题,主要涉及页面显示、表单提交以及数据库操作等环节。理解并掌握这些环节的编码处理至关重要,以确保数据的准确性和用户体验。 1. **JSP文件的...

    JSP中文乱码问题分析及处理方法

    JSP中文乱码问题主要是由字符编码不一致引起的,通过在JSP文件中明确指定编码格式或在服务器层面配置统一的编码标准,可以有效地解决这一问题。在实际开发中,应根据项目的规模和需求选择合适的解决方案,确保中文...

    struts1.2 解决中文乱码

    ### Struts 1.2 中文乱码问题详解与解决方案 #### 一、问题背景及原因分析 在 Web 应用开发过程中,特别是在使用 Java 的 Struts 1.2 框架时,中文乱码问题是开发者经常遇到的一个难题。这不仅影响用户体验,还会...

    jsp中文乱码过滤器

    **JSP中文乱码过滤器详解** 在Java Web开发中,JSP(JavaServer Pages)是一种常见的用于创建动态网页的技术。然而,当处理包含中文字符的数据时,可能会遇到乱码问题,这通常与字符编码设置有关。为了解决这个问题...

    flask_sqlachemy连接db2,插入中文乱码,问题解决

    **分析原因**:可能是由于DB2数据库本身的字符集设置与URL中指定的字符集不符,导致数据在转换过程中出现乱码。 ##### 解决方案二:修改Flask-SQLAlchemy源码 - **修改目标文件**:`flask_sqlalchemy/__init__.py`...

    java中文乱码字符集解决大全.pdf

    Java中文乱码问题详解 Java程序在处理中文字符时可能会遇到乱码问题,这主要源于计算机历史上的编码标准差异和Java自身的编码机制。本文将详细分析这个问题的来源、Java编码转换的过程以及解决策略。 1. 中文问题...

    mysql中文乱码解决

    ### MySQL中文乱码解决方案 #### 一、问题背景与成因 在IT行业中,数据库迁移或更新是非常常见的操作。然而,在不同的服务器环境或MySQL版本之间迁移数据库时,常常会遇到中文乱码的问题。这种情况通常发生在从旧...

    jquery自动补全示例。包括后台,中文乱码解决JS

    中文乱码问题通常发生在数据传输过程中,尤其是在Ajax请求服务器数据时。确保在HTML文件中设置正确的字符编码(如`&lt;meta charset="UTF-8"&gt;`),并在Ajax请求中指定`contentType`为`'application/json; charset=utf-8...

    js获取中文地址栏参数

    在进行Web开发的过程中,经常会遇到需要从URL地址栏中获取参数的情况,特别是当涉及到中文字符时,处理起来可能会更加复杂。本文将详细讲解如何利用JavaScript(简称JS)来正确地获取URL中的中文参数,并解决可能...

    hibernate数据库中文乱码问题

    ### Hibernate数据库中文乱码问题详解 #### 背景与问题描述 在使用Hibernate框架进行数据库操作时,可能会遇到中文乱码的问题。特别是在使用MySQL作为数据库,并且已将数据库编码设置为`utf-8`的情况下,依然出现...

Global site tag (gtag.js) - Google Analytics