URL地址中英文乱码详解(javascript中encodeURI和decodeURI方式、java.net.URLDecoder.encode、java.net.URLDecoder.decode)版权声明

原创
小哥 3年前 (2022-12-26) 阅读数 9 #大杂烩

引言: 在Restful在类的服务设计中,经常会遇到这样的需求URL在使用中文作为地址中的参数的情况下,在这种情况下,通常需要正确设置和编码汉字信息。出现了随机码的问题。该如何解决?请仔细听这篇文章。

  1.  引出问题

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

  1. 乱码是如何生成的?

因为我们使用URL通过这种方式传递参数取决于浏览器环境。URL及URL每个key=value在浏览器地址栏中的处理原理处理了相应的编码之后,格式中的参数键值对被传递到后台进行解码。

由于我们目前尚未进行任何处理javascript请求URL当参数以中文传递时(即当在输入框中输入中文时),是URL中文参数根据浏览器机制进行编码。此时,存在乱码问题。

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

利用encodeURI()在javascript中对中文URL参数编码后,单词“test”将转换为“%E6%B5%8B%E8%AF%95”。 但问题依然存在。原因是在对字符串信息进行编码后,浏览器机制会认为“%是转义字符,浏览器会将地址栏URL传入的转换参数%”与“%之间的转义字符将被处理并传递到后台。这将导致和实际通过encodeURI()编码后的URL不匹配,因为浏览器错误地认为“%是转义字符,但不是%“把它想象成一个普通的角色。

  1. 辅助编码,使用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”,与此字符串对应的中文正是我们输入的单词“test”。

  1. 如何在后台正确解析汉字信息?

进入后台的信息传递两次。encodeURI()之后,就不可能直接读取正确的信息。 需要按以下步骤继续处理:

[html] view plain copy

  1. URLDecoder.decode("chinese string","UTF-8")

URLDecoder的decode(String str,String ecn)该方法有两个参数,第一个参数是要解码的字符串,第二个参数是解码期间的相应编码。

  1.   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。

  1. 另一种治疗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方法

1.基本概念
encodeURI和decodeURI它是成对使用的,因为如果浏览器的地址栏包含中文字符,可能会发生意外错误,因此您可以encodeURI将非英文字符转换为英文代码,decodeURI可用于恢复字符。encodeURI方法不编码以下字符:":"、"/"、";" 和 "?",encodeURIComponent方法可以对这些字符进行编码。
decodeURI()方法等效java.net.URLDecoder.decode(URIString, "UTF-8");
encodeURI()方法等效java.net.URLEncoder.encode(URIString, "UTF-8");

二、例子

编码后的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");

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除