我有一些UTF-8的问题.我的客户端(在GWT中实现)向我的servlet发出请求,URL中有一些参数,如下所示:
http://localhost:8080/servlet?param=value
Run Code Online (Sandbox Code Playgroud)
当我在servlet中检索URL时,我遇到了UTF-8字符的问题.我用这个代码:
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String reqUrl = request.getRequestURL().toString();
String queryString = request.getQueryString();
System.out.println("Request: "+reqUrl + "?" + queryString);
...
Run Code Online (Sandbox Code Playgroud)
所以,如果我打电话给这个网址:
http://localhost:8080/servlet?param=così
Run Code Online (Sandbox Code Playgroud)
结果是这样的:
Request: http://localhost:8080/servlet?param=cos%C3%AC
Run Code Online (Sandbox Code Playgroud)
如何正确设置字符编码?
我做了以下"模拟":
byte[] b = new byte[256];
for (int i = 0; i < 256; i ++) {
b[i] = (byte) (i - 128);
}
byte[] transformed = new String(b, "cp1251").getBytes("cp1251");
for (int i = 0; i < b.length; i ++) {
if (b[i] != transformed[i]) {
System.out.println("Wrong : " + i);
}
}
Run Code Online (Sandbox Code Playgroud)
对于cp1251这个输出只有一个错误的字节 - 在位置25.
对于KOI8-R- 所有罚款.
适用于cp1252- 4或5个差异.
这是什么原因以及如何克服这个原因?
我知道在任何编码中将字节数组表示为字符串是错误的,但这是支付提供商协议的要求,所以我没有选择权.
更新:在ISO-8859-1作品中代表它,我将它用于byte[]部分和cp1251文本部分,所以问题仍然只是出于好奇
有没有人知道或者我知道可以用来操作查询字符串的java类?
基本上我想要一个类,我可以简单地给一个查询字符串,然后删除,添加和修改查询字符串KVP.
提前致谢.
编辑
在回答对此问题的评论时,查询字符串将看起来像这样;
N=123+456+112&Ntt=koala&D=abc
Run Code Online (Sandbox Code Playgroud)
所以我想把这个类传递给查询字符串并说出类似的内容.
String[] N = queryStringClass.getParameter("N");
Run Code Online (Sandbox Code Playgroud)
然后也许吧
queryStringClass.setParameter("N", N);
Run Code Online (Sandbox Code Playgroud)
有可能 queryStringClass.removeParameter("N");
或者那种效果.
我在JSP页面中有这样一个链接,编码为big5 http:// hello/world?name =婀ㄉ 当我在浏览器的URL栏中输入它时,它将被改为 http:// hello/world?name = %23%24%23 当我们想在jsp页面中获取此参数时,所有字符都已损坏.
我们设置了这个:request.setCharacterEncoding("UTF-8"),因此所有请求都将转换为UTF8.
但为什么在这种情况下,它不起作用?提前致谢!.
我在评论中读到@Esailija对我的一个问题的回答
ISO-8859-1是唯一完全保留原始二进制数据的编码,具有精确的字节< - >代码点匹配
我也在@AaronDigulla的回答中读到:
在Java中,ISO-8859-1(又名ISO-Latin1)是1:1映射
我需要对此有所了解.这将失败(如图所示这里):
// \u00F6 is ö
System.out.println(Arrays.toString("\u00F6".getBytes("utf-8")));
// prints [-61, -74]
System.out.println(Arrays.toString("\u00F6".getBytes("ISO-8859-1")));
// prints [-10]
Run Code Online (Sandbox Code Playgroud)
ISO-8859-1)在哪里 - 链接到源,或者JSL会很好.它是唯一具有此属性的编码吗?ISO-8859-1作为默认默认?另请参阅此问题以获取其他字符集中的反例.
我在java servlet文件中遇到UTF-8的问题.当我在URL中获取参数值时,我遇到了UTF-8字符的问题.它无法正确显示日文字符.
Jsp头已经有了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Run Code Online (Sandbox Code Playgroud)
我在连接器中将URIEncoding设置添加到server.xml中的UTF-8.
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
Run Code Online (Sandbox Code Playgroud)
我在jsp中编写了以下代码.
<s:textfield key="txt_name" name="txt_name" id="txt_name"
maxlength="64"></s:textfield>
<a href="javascript:showModalWindow('PopUpFile!init.action?<%=Common.PASSWORD%>=<%=Common.encript(ID, Code)%>','',940,650);">
<s:property value="PopUp Link" />
</a>
<script>
function showModalWindow(x_URL, x_ARG, x_WIDTH, x_HEIGHT) {
var x_OPT = "dialogHeight: " + x_HEIGHT + "px; " + "dialogWidth: "
+ x_WIDTH + "px; "
+ "edge: Raised; center: Yes; resizable: Yes; status: Yes;";
x_URL += "&name="+document.getElementById("txt_name").value;
var retValue = window.showModalDialog(x_URL, x_ARG, x_OPT);
if (retValue …Run Code Online (Sandbox Code Playgroud) 可能有很多方法可以解决编码问题:
编码过滤器,如Spring MVC UTF-8编码
在Tomcat的server.xml中设置URIEncoding = UTF-8,如http://struts.apache.org/release/2.1.x/docs/how-to-support-utf-8-uriencoding-with-tomcat.html.
request.setCharacterEncoding(utf-8)
今天,我遇到的问题是路径参数不能很好地解码
@ResponseBody
@RequestMapping(value="/context/method/{key}",method=RequestMethod.GET,produces = "application/json;charset=utf-8")
public String method(@PathVariable String key){
logger.info("key="+key+"------------");
}
Run Code Online (Sandbox Code Playgroud)
我可以看到密钥被解码坏了!如果我"??"从前端传出一个字,它就会变成"æ°æµª".我编写以下代码来检查服务器是否使用"ISO-8859-1"对其进行解码:
public static void main(String args[]) throws UnsupportedEncodingException{
String key="??";
byte[] bytes=key.getBytes("UTF-8");
String decode=new String(bytes,"ISO-8859-1");
System.out.println(decode);
}
Run Code Online (Sandbox Code Playgroud)
它出来的输出相同"æ°æµª".实际上,路径变量用ISO-8859-1解码.
然后我尝试添加一个过滤器web.xml来解决这个问题:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
但是同样的乱码.
直到我在下面设置我的 server.xml
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true" ----Here is Added
/> …Run Code Online (Sandbox Code Playgroud) 我有一个带有一些编码问题的Struts2应用程序.我的JSP页面显示2个表单; 当我发送第一个(一个简单的常规表单,重新加载整页),非标准字符,如á或ñ正确发送和显示.然而,当我做的第二形式(其通过AJAX发送)是相同的,该数据被破坏(Ãí,Ã!等等).
main.jsp中:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
...
<s:head theme="ajax"/>
</head>
<body>
<!-- This form is sent via regular HTTP request -->
<s:form theme="simple" enctype="multipart/form-data">
<s:textfield key="field1" name="var1"/>
<s:submit key="send" action="SAVE_ACTION"/>
</s:form>
<div id="ajaxContainer">
<jsp:include file="ajax-part.jsp"/>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Ajax的part.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" …Run Code Online (Sandbox Code Playgroud) 我正在使用java servlet为我的课程构建一个Web应用程序.在某些时候,我想重定向到一个jsp页面,发送一些想要在那里使用的信息(使用GET方法).在我的servlet中,我有以下代码:
String link = new String("index.jsp?name="+metadata.getName()+"&title="+metadata.getTitle());
response.sendRedirect(response.encodeRedirectURL(link));
Run Code Online (Sandbox Code Playgroud)
在jsp中,我使用了这些参数
<%
request.getParameter("name");
request.getParameter("title");
%>
Run Code Online (Sandbox Code Playgroud)
一切正常,除非参数不包含拉丁字符(在我的情况下,它们可以包含希腊字符).例如,如果name =ΕΡΕΥΝΑΣ我得到名字=¡¥.如何解决此编码问题(将其设置为UTF-8)?是不是encodeRedirectURL()做这个工作?我应该在某个时候使用encodeURL()吗?我尝试了最后一个,但问题仍然存在.
提前致谢 :)
我在eclipse juno中有一个webapp - 当我在服务器上运行时运行正常 - 在eclipse的浏览器(我在Windows上)或在FF中.
右键单击> 导出war >将其转储到$ CATALINA_HOME/webapps>一切正常(解压缩好了)EXCEPT
我的自定义标签 - 我有一个WEB-INF\functions.tld显然没有读过的文件.自动生成的eclipse server.xml(在Servers项目中)和默认的Tomcat 之间的唯一区别server.xml是:
<Context docBase="ted2012" path="/ted2012"
reloadable="true"source="org.eclipse.jst.jee.server:ted2012"/>
Run Code Online (Sandbox Code Playgroud)source是WTP特定属性.
我设法解决了 - 看我的答案
问题:
web.xml?(在我的回答中解决,应该是另一个问题)代码在github中 - 在文件INSTRUCTIONS.txt中有详细的说明来设置项目并重现我在下面的答案中描绘的错误.
Tomcat 7.0.32,eclipse 4.2,java 1.7.9
我在URL中有#个符号作为参数传递。但是它将丢弃#之后的所有参数值。请给我建议。以下是我的网址
GetConnectiont?
customerID=customer1&activenode=Sv50&parent=server&frame=imHealthCheckFrame&
connectedFrom=healthCheck&username=root&password=anil#1234&fromAskUsrPwd=askPassword
Run Code Online (Sandbox Code Playgroud)
提前致谢
java ×8
servlets ×4
encoding ×3
utf-8 ×3
jsp ×2
struts2 ×2
tomcat ×2
ajax ×1
dojo ×1
eclipse ×1
getparameter ×1
iso-8859-1 ×1
java-ee ×1
javascript ×1
jquery ×1
query-string ×1
request ×1
servlet-3.0 ×1
spring ×1
string ×1
unicode ×1