java转码后局部乱码问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java转码后局部乱码问题相关的知识,希望对你有一定的参考价值。

项目中遇到一个问题,java转码后会出现局部乱码问题,demo如下
String s = new String("中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt".getBytes(),"UTF-8");
System.out.println(s);
s = new String(s.getBytes("UTF-8"), "GBK");
System.out.println(s);
s = new String(s.getBytes("GBK"), "UTF-8");
System.out.println(s);
测试了一下,输出结果如下:
中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt
涓枃娴嬭瘯灞�閮ㄤ贡镰侀棶棰�2011涓枃娴嬭瘯涓娄紶鏂囦欢鍚崭贡镰侀棶棰�.txt
中文测试�?部乱码问�?2011中文测试上传文件名乱码问�?.txt

字符就在这种转来转去中变成了乱码,
目前做的项目遇到了类似的问题,是控件上传字符编码与系统编码不一致导致的,虽然知道了症结所在,但还是没有想好该怎么改,有高手能解决这种局部乱码的问题吗? 谢谢了 在线等

问题给你解决了,看代码

public class Test
public static void main(String[] args)

try
String s = new String("中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt".getBytes(),
"UTF-8");
System.out.println(s);
s = java.net.URLDecoder.decode(s, "utf-8"); //utf8转gbk
System.out.println(s);
Test convert = new Test();
byte[] fullByte = convert.gbk2utf8(s); //gbk转utf8
String fullStr = new String(fullByte, "UTF-8");
System.out.println("string from GBK to UTF-8 byte: " + fullStr);

catch (Exception e)
e.printStackTrace();



public byte[] gbk2utf8(String chenese)
char c[] = chenese.toCharArray();
byte[] fullByte = new byte[3 * c.length];
for (int i = 0; i < c.length; i++)
int m = (int) c[i];
String word = Integer.toBinaryString(m);

StringBuffer sb = new StringBuffer();
int len = 16 - word.length();

for (int j = 0; j < len; j++)
sb.append("0");

sb.append(word);
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");

String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16);

byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
byte[] bf = new byte[3];
bf[0] = b0;
fullByte[i * 3] = bf[0];
bf[1] = b1;
fullByte[i * 3 + 1] = bf[1];
bf[2] = b2;
fullByte[i * 3 + 2] = bf[2];


return fullByte;



结果:
中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt
中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt
string from GBK to UTF-8 byte: 中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt追问

首先很感谢您的回答,
但是我接收到该参数时已经处于
String s = new String("中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt".getBytes(),"UTF-8");
s = new String(s.getBytes("UTF-8"), "GBK");
这两步之后了,
而您是用
s = java.net.URLDecoder.decode(s, "utf-8"); //utf8转gbk
替换了s = new String(s.getBytes("UTF-8"), "GBK");并没有真正的转换成GBK
我这还是无法实现的

追答

s = new String(s.getBytes("UTF-8"), "GBK");到此步之后字符串编码已经错误了,以后任凭你怎么转都无济于事。
这一步是封装好了的吗,即使是封装好了的那也是写错了呀,也应该修改呀

追问

这个不是我封装的是Struts2封装的, 我用的uploadify控件,其swf会将上传的文件名用UTF-8方式编码(我看了一下它的源文件用的是UTF-8编码,可惜我不会as编程要不就直接改这个文件方便),我们的项目用的是GBK的编码,我测试了一下,在项目中收到的参数内容和用new String(s.getBytes("UTF-8"), "GBK");转换完的内容完全一致,弄的我晕的, 呵呵, 不行的话我只能换上传控件了。

参考技术A 从第一行正确可以看出,你的系统默认编码是UTF-8;
第一行的意思是根据UTF-8解码,然后再编码
所以用什么解码,就需要用什么编码
String s = new String("中文测试局部乱码问题2011中文测试上传文件名乱码问题.txt".getBytes(),"UTF-8");
System.out.println(s);
s = new String(s.getBytes("GBK"), "GBK");
System.out.println(s);
s = new String(s.getBytes("UTF-8"), "UTF-8");
System.out.println(s);
参考技术B 控件上传的是什么编码你查一下嘛,然后直接new String(s.getBytes("控制上传字符串的编码"),"你指定的编码格式") 就好了,tomcat中的表单默认的上传编码格式是ISO-8859-1,直接转成你要的格式:如new String(getRequest().getParameter("content").getBytes("ISO-8859-1"), "UTF-8");追问

控件上传是"UTF-8"的,我们在struts2里配置的,这样我们在接收的时候都转成了GBK的, 我在系统里在转回UTF-8格式的编码就出现了这种局部乱码, 并不是全部乱码。

1requests基础

一、升级pip版本的命令 : python -m pip install --upgrade pip

 二、requests安装  windows系统系cmd运行 pip install requests

三、requests的相关基础操作

1、模拟get请求,对text进行转码后可以处理乱码的问题

技术图片

 

 2、模拟带参数的get请求

技术图片

 

 3、自定义请求头

技术图片

 

 4、json、jsonpath

一、将字典转换成字符串

json.dunps()

二、将字符串转换成字典,字符串里面键值对要用双引号

json.loads()

三、jsonpath取值,与jmeter jsonpath取值语法一致

技术图片

 

 5、模拟post请求:post传json数据时需要将数据转换成字符串 post传参: url  data(json) params headers

技术图片

 

 6、文件上传

技术图片

 

 技术图片

 

 技术图片

 

以上是关于java转码后局部乱码问题的主要内容,如果未能解决你的问题,请参考以下文章

Properties文件中文属性读取是乱码问题

HttpServlet 下载图片中文名乱码问题

linux计划任务执行脚本显示乱码

页面与后台传递中文乱码问题(java乱码)

JAVA UTF-8文本再次转UTF-8就会乱码

php数组转json中文乱码解决办法