Java传xml时字符串乱码_小结getBytes()默认编码导致的xml字符串中出现乱码

"博客讲述了在Spring环境中,微信小程序后端部署在SAE上遇到的乱码问题。作者通过排查发现,问题出在发送消息时,由于Windows默认编码是GBK,导致汉字被错误编码,而接收端按照UTF-8解码,从而出现乱码。解决方案是确保编码转换正确,即使用`getBytes("utf-8")`进行编码,避免依赖平台默认编码。"
摘要由CSDN通过智能技术生成

遇到乱码第一印象想到的是如何统一编码,很少注意到这期间穿插的某些过程也是一大隐患..

sae上部署了一个spring写的微信小程序,手机总关注测试号点击菜单得到的文本消息却是乱码..

聚焦发送消息的部分代码:

response.setCharacterEncoding("utf-8");

response.getOutputStream().write(result.getBytes());

编码已经设置为utf-8,spring也加了过滤器进行utf-8的解码...而且控制台也的确打印出没有乱码的发送信息..想当然的认为这头一定没问题..

然后只好写个测试代码从获得数据的那头获取:

entity = newStringEntity(doc.asXML());post.setEntity(entity);

HttpResponse response=client.execute(post);

String result=EntityUtils.toString(response.getEntity());

System.out.println("结果:"+result);

结果得到的就是乱码,如果接收方代码如下改则不会乱码:

String result = EntityUtils.toString(response.getEntity(),"gbk");

证明乱码部分发过来的是gbk的..我的确是有点蒙了,下午被sae的坑人环境坑了大半天脑袋早木了..又细想了一下既然发过来是乱码,编码的时候又是正常的,那也只可能是getBytes()这一处能出问题了,也只有这一处动过编码后的字符串..看看api说明吧:

Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.

我倒了..这才恍然大悟,我本地是windows系统,默认是gbk,所以此处会将那部分中文按照gbk编码然后传过去,因为我们response.setXX("utf-8")了,所以接收方按照utf-8来解码,直接乱码..

所以我们应该改成:

response.setCharacterEncoding("utf-8");

response.getOutputStream().write(result.getBytes("utf-8"));

则接收方无需做任何处理便可得到没有乱码的中文..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Java的Filter接口来实现过滤器,具体代码如下: 请求过滤器: ``` public class RequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 请求处理 HttpServletRequest req = (HttpServletRequest) request; String requestURI = req.getRequestURI(); System.out.println("Request URI: " + requestURI); // 继续执行过滤器链 chain.doFilter(request, response); } @Override public void destroy() { // 销毁操作 } } ``` 响应过滤器: ``` public class ResponseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 响应处理 HttpServletResponse resp = (HttpServletResponse) response; resp.setCharacterEncoding("UTF-8"); // 继续执行过滤器链 chain.doFilter(request, response); } @Override public void destroy() { // 销毁操作 } } ``` 在web.xml配置过滤器: ``` <filter> <filter-name>RequestFilter</filter-name> <filter-class>com.example.RequestFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>ResponseFilter</filter-name> <filter-class>com.example.ResponseFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样就可以实现请求和响应的字符串乱码处理了。 关于lua closure factory的完整代码,我不清楚你具体需要什么样的代码,可以提供更详细的信息吗? 文加密的问题,可以使用Java的加密算法来实现,比如MD5、SHA等。具体代码如下: ``` import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class EncryptUtil { public static String md5(String str) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes()); byte[] bytes = md.digest(); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } public static String sha1(String str) { try { MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] bytes = md.digest(); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } } ``` 这样就可以实现文加密了。 ### 回答2: 在Java使用过滤器可以实现请求和响应的处理。对于请求的处理,可以通过自定义过滤器实现编码的设置,防止乱码的出现。而对于响应的处理,可以通过过滤器修改响应的字符集,将乱码进行处理。 首先,要创建一个过滤器类来处理请求的编码设置。我们可以实现javax.servlet.Filter接口,并覆盖doFilter方法。在doFilter方法,我们可以通过调用HttpServletRequest的setCharacterEncoding方法设置请求的字符集编码。例如,我们可以将字符集设置为UTF-8编码: ```java public class RequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } @Override public void destroy() { } } ``` 接下来,我们可以创建另一个过滤器来处理响应的字符集。同样地,我们实现javax.servlet.Filter接口,并在doFilter方法调用HttpServletResponse的setCharacterEncoding方法设置响应的字符集编码。以下是一个示例: ```java public class ResponseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } @Override public void destroy() { } } ``` 在Web应用程序的web.xml文件,我们需要配置这两个过滤器。例如: ```xml <filter> <filter-name>RequestFilter</filter-name> <filter-class>com.example.RequestFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>ResponseFilter</filter-name> <filter-class>com.example.ResponseFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 通过上述配置,我们可以确保在请求和响应过程正确地处理字符集编码,防止乱码的出现。 ### 回答3: 在Java,可以使用过滤器来对请求和响应进行处理。要实现一个写请求的过滤器,我会创建一个新的Java类,并使其实现javax.servlet.Filter接口。在doFilter方法,我会通过获取HttpServletRequest对象,从读取请求的内容,并对其进行处理,例如检查参数是否合法或对特定内容进行修改。处理后的请求内容将会被递给FilterChain对象的doFilter方法,继续处理。 以下是一个示例的写请求的过滤器的代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class RequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 这里可以进行过滤器的初始化操作,如果有的话 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; // 对请求内容进行处理 // 继续处理 chain.doFilter(request, response); } @Override public void destroy() { // 可以进行一些资源清理的操作,如果有的话 } } ``` 接下来,我会创建一个写响应字符串乱码处理的过滤器。在doFilter方法,我会通过获取HttpServletResponse对象,设置响应的字符编码为UTF-8,以确保处理后的字符串不会出现乱码。 以下是一个示例的写响应字符串乱码处理的过滤器的代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ResponseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 这里可以进行过滤器的初始化操作,如果有的话 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; // 设置响应的字符编码为UTF-8 httpResponse.setCharacterEncoding("UTF-8"); // 继续处理 chain.doFilter(request, response); } @Override public void destroy() { // 可以进行一些资源清理的操作,如果有的话 } } ``` 以上是用Java过滤器实现写请求和写响应字符串乱码处理的简单示例。根据实际需求,你可以进一步修改和扩展这些过滤器的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值