获得网站后台地址,南平seo,用html制作网站代码,wordpress 技术java在字符串中统一用Unicode表示。
对于任意一个字符串#xff1a;String string “测试字符串”;
如果源文件是GBK编码#xff0c;操作系统默认环境编码也为GBK#xff0c;那么编译的时候#xff0c;JVM将按照GBK编码将字节数组解析为字符#xff0c;然后将字符转换为…java在字符串中统一用Unicode表示。
对于任意一个字符串String string “测试字符串”;
如果源文件是GBK编码操作系统默认环境编码也为GBK那么编译的时候JVM将按照GBK编码将字节数组解析为字符然后将字符转换为Unicode格式的字节数组作为内部存储(字节数组→字符→Unicode字节数组)
当打印这个字符串时JVM根据操作系统本地的语言环境将Unicode转换为GBK然后操作系统将GBK格式的内容显示出来。
当源码文件是UTF-8, 我们需要通知编译器源码的格式javac -encoding utf-8 … , 编译时JVM按照utf-8 解析成字符然后转换为unicode格式的字节数组 那么不论源码文件是什么格式同样的字符串最后得到的unicode字节数组是完全一致的显示的时候也是转成GBK来显示跟OS环境有关
乱码是如何产生的
本质上都是由于字符串原本的编码格式与读取时解析用的编码格式不一致导致的。
乱码指的是程序显示出来的字符文本无法用任何语言去解读。一般情况下会包含大量的?。乱码问题是所有计算机用户或多或少会遇到的问题。造成乱码的原因就是因为使用了错误的字符编码去解码字节流因此当我们在思考任何跟文本显示有关的问题时请时刻保持清醒当前使用的字符编码是什么。只有这样我们才能正确分析和处理乱码问题。
例如最常见的网页乱码问题。如果你是网站技术人员遇到这样的问题需要检查以下原因
服务器返回的响应头Content-Type没有指明字符编码网页内是否使用META HTTP-EQUIV标签指定了字符编码网页文件本身存储时使用的字符编码和网页声明的字符编码是否一致java代码中的乱码问题如何解决呢
例如String s “测试字符串”;
System.out.println( new String(s.getBytes(),UTF-8));
//错误因为getBytes()默认使用GBK编码 而解析时使用UTF-8编码肯定出错。
其中getBytes()是将Unicode转换为操作系统默认格式的字节数组即“测试字符串”的GBK格式new String (bytes, Charset) 中的charset 是指定读取byte的方式这里指定为UTF-8即把bytes的内容当做UTF-8来读取。
如下两种方式得到的结果都是正确的因为它们的源内容编码和解析用的编码是一致的。
System.out.println( new String(s.getBytes(),GBK));
System.out.println( new String(s.getBytes(UTF-8),UTF-8));
那么如何利用getBytes 和 new String() 来进行编码转换呢 网上流传着一种错误的方法:
GBK-- UTF-8: new String( s.getBytes(GBK) , UTF-8);
这种方式是完全错误的因为getBytes 的编码与 UTF-8 不一致肯定是乱码。
但是为什么在tomcat 下使用 new String(s.getBytes(“iso-8859-1”) ,”GBK”) 却可以用呢
答案是
tomcat 默认使用iso-8859-1编码 也就是说如果原本字符串是GBK的tomcat传输过程中将GBK转成iso-8859-1了默认情况下使用iso-8859-1读取中文肯定是有问题的那么我们需要将iso-8859-1 再转成GBK 而iso-8859-1 是单字节编码的即他认为一个字节是一个字符 那么这种转换不会对原来的字节数组做任何改变因为字节数组本来就是由单个字节组成的如果之前用GBK编码那么转成iso-8859-1后编码内容完全没变 则 s.getBytes(“iso-8859-1”) 实际上还是原来GBK的编码内容则 new String(s.getBytes(“iso-8859-1”) ,”GBK”) 就可以正确解码了。 所以说这是一种巧合。
如何正确的将GBK转UTF-8 ? 实际上是unicode转UTF-8)
//利用getBytes将unicode字符串转成UTF-8格式的字节数组然后用utf-8 对这个字节数组解码成新的字符串
new String( s.getBytes(utf-8) , utf-8);UTF-8 转GBK原理也是一样
new String( s.getBytes(GBK) , GBK);
其实核心工作都由getBytes(charset)做了。getBytes的JDK描述Encoding this String into a sequence of bytes using the named charset,storing the result into a new byte array.
OutputStreamWriter w1 new OutputStreamWriter(new FileOutputStream(D:\\file1.txt),UTF-8);
InputStreamReader( stream, charset)可以帮助我们轻松的按照指定编码读写文件。
附录 HttpClient post请求中文乱码问题解决
最近接到现场同事反馈在掉接口的过程中厂家收到的请求报文中文是乱码的。我检查了版控的代码找到如下解决办法
原始代码中文乱码
HttpPost httpPost new HttpPost(url);
DefaultHttpClient httpClient new DefaultHttpClient();
//请求头
httpPost.setHeader(Accept, MediaType.APPLICATION_JSON);
httpPost.setHeader(Content-Type, application/json;charsetUTF-8);
//请求实体
StringEntity reqEntity new StringEntity(reqStr);
httpPost.setEntity(reqEntity);
//获取响应
HttpResponse httpResp httpClient.execute(httpPost);
HttpEntity respEntity httpResp.getEntity();解决方案
方法一//请求实体
HttpEntity reqEntity new ByteArrayEntity(reqStr.getBytes(UTF-8));
//StringEntity reqEntity new StringEntity(reqStr);
httpPost.setEntity(reqEntity);方法二//请求实体
StringEntity reqEntity new StringEntity(reqStr,Charset.forName(UTF-8));
httpPost.setEntity(reqEntity);转自https://blog.csdn.net/lmb55/article/details/78857024