String与byte[]字节数组中文转换乱码问题

摘要:
E、 g.字节[]b_ GBK=“中等”。获取字节(“gbk”);byte[]b_ Utf8=“中等”。getBytes(“UTF-8”);byte[]b_ Unicode=“中等”。getBytes(“unicode”);b_ unicode的长度为4(系统的unicode使用big endian,由前面的两个字节表示。

  Sunshine的 String.getBytes()和new String() 

在Java中,String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,

byte[] b_gbk = "中".getBytes("GBK");

byte[] b_utf8 = "中".getBytes("UTF-8"); 

byte[] b_iso88591 = "中".getBytes("ISO8859-1");

byte[] b_unicode = "中".getBytes("unicode");

将分别返回“中”这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1,b_unicode 的长度为4(系统的的unicode采用的是big-endian就是前面是两个字节来表示这个的,unicode采用的都是两个字节编码,所以后面是4个字节 )。

而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“中”字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串。

String s_gbk = new String(b_gbk,"GBK");

String s_utf8 = new String(b_utf8,"UTF-8"); 

String s_iso88591 = new String(b_iso88591,"ISO8859-1");

 通过打印s_gbk、s_utf8和s_iso88591,会发现,s_gbk和s_utf8都是“中”,而只有s_iso88591是一个不认识的字符,为什么使用ISO8859-1编码再组合之后,无法还原“中”字呢,其实原因很简单,因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"中".getBytes("ISO8859-1");来得到正确的“中”字在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。

因此,通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。

有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1 编码),可能会通过将中文字符按照字节方式来编码的情况,如  String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1"),这样得到的s_iso8859-1字符串实际是三个在ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式String s_utf8 = new  String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来得到正确的中文汉字“中”。这样就既保证了遵守协议规定、也支持中文。

String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点,你会发现在一个平台上运行.    良好的系统,放到另外一台机器后会产生意想不到的问题。

免责声明:文章转载自《String与byte[]字节数组中文转换乱码问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[个人网站搭建]·极简方式统计个人网页访问量(基于百度统计)管理软件预警通知(Notification)功能的实现案例分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DB2字符处理函数

转自:http://www.blogjava.net/bingle/archive/2007/07/11/129681.html -----------------------------------字符串连接运算:db2中使用的是"||"----------------------------------- 一、字符转换函数 1、ASCII() 返回字符...

MySQL 通配符学习小结

MySQL 通配符 SQL的模式匹配同意你使用“_”匹配不论什么单个字符,而“%”匹配随意数目字符(包含零个字符)。在 MySQL中,SQL的模式缺省是忽略大写和小写的。以下显示一些样例。 注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比較操作符。 为了找出以“b”开头的名字: mysql>...

PLSQL程序设计(Oracle)

Hello World set serveroutput on; declare --说明部分 begin --程序 dbms_output.put_line('Hello World'); end; / 什么是PL/SQL? PL/SQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(...

js正则表达式 URL格式匹配详解

0、URL格式 protocol :// hostname[:port] / path / [;parameters][?query]#fragment [;parameters]没见过 这里就不做相关匹配了 1、代码及运行结果 'use strict'; { // URL地址匹配格式: protocol :// hostname[:port...

Base64字符 转图片乱码问题

网站做了个随机验证码图片功能,遇到了一个奇怪的问题——Base64字符集转图片乱码问题,问题描述如下 1.用java画笔将随机验证码绘制成图片 2.再将图片的二进制代码转换成Base64字符集,返回给前端, 以上步骤,在本地window环境下,随机验证码图片生成base64字符传送到前端,能完美解析出来,但是部署到生产环境(centos)上,则解析base...

(转)VC++的Unicode编程

一、什么是Unicode  先从ASCII说起,ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H...