`

关于字节编码问题

阅读更多
近期在做项目时,遇到如下问题。先看代码:
package test11;

public class TestStr {
	public static void main(String[] args) throws Exception {
		byte[] bytE = new byte[]{24, -122, 61, 102, -51, -78, 17, 126};
		String str2 = new String(bytE);
		byte[] bytE2 = str2.getBytes();
		for(byte b:bytE2){
			System.out.print(b + ",");
		}
	}
}

测试结果:
24,63,61,102,-51,-78,17,126,

对于字节数组使用new String(bytE)转换后,再使用String类的getBytes()编码还原,发现编码前后字节数组不一致。经查默认情况下使用UTF-8编码,而UTF-8是可变长度的编码,原来的字节数组就被改变了,而ISO8859-1通常叫做Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中 0~127的字符与ASCII码相同,它是单字节的编码方式,这样第二种方式生成的String里的字节数组就跟原来的字节数组一样(参考文章:http://blog.csdn.net/jiangxinyu/article/details/8228807)。因此将代码修正为如下,可以正常编码:
package test11;

public class TestStr {
	public static void main(String[] args) throws Exception {
		byte[] bytE = new byte[]{24, -122, 61, 102, -51, -78, 17, 126};
		String str2 = new String(bytE,"ISO-8859-1");
		byte[] bytE2 = str2.getBytes("ISO-8859-1");
		for(byte b:bytE2){
			System.out.print(b + ",");
		}
	}
}

在String--byte[]--String处理模式中,使用默认或者其它编码格式都可以;但在String--byte[]--byte[]--String--byte[]处理模式中,涉及字节数组被处理成新的字节数组后多次转换传递时,为了避免字节数组变化而影响结果,可以使用ISO-8859-1进行处理。在处理中文时,可以使用GBK或UTF-8,而不能使用ISO-8859-1,否则会出现乱码。因此模式二下同时涉及中文,可以使用两者结合的方式,例如下边的代码:
package test11;

public class TestStr {
	public static void main(String[] args) throws Exception {
		String str = "张三";
		String str1 = new String(str.getBytes("UTF-8"),"ISO-8859-1");
		String str2 = new String(str1.getBytes("ISO-8859-1"),"UTF-8");
		System.out.println(str2);
	}
}


注意:此处使用的是String类的构造方法传入编码方式进行的数据转换
分享到:
评论

相关推荐

    字节流编码获取

    在IT领域,字节流(Byte Stream)是数据在计算机内部和网络中传输的基本单位,而编码则关乎数据如何被转换成字节流以便于处理和传输。在处理字节流编码时,我们通常会遇到诸如字符集、字节顺序标记(BOM)、解码与...

    字符,字节和编码 字符,字节和编码

    说明字符编码在java,c中的转换 说明字符编码在java,c中的转换 说明字符编码在java,c中的转换

    字符,字节和编码.中文问题”,“乱码问题”。

    本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致...本文的内容涵盖了“中文问题”,“乱码问题”。

    获取文件流字节编码的类(VS.NET)

    在.NET框架中,处理文件流字节编码是一个常见的任务,特别是在进行文件读写、网络传输或者数据序列化等操作时。本文将详细讲解如何在Visual Studio .NET环境下使用不同的类来获取文件流中的字节编码。 首先,我们...

    汉字编码转换为字节码工具

    1. **GB2312**:中国国家标准简体中文字符集,包含6763个常用汉字,是最早的汉字编码标准之一,采用双字节编码方式。 2. **GBK**:基于GB2312扩展,增加了对繁体字和其他少数字符的支持,共计20902个字符,同样采用...

    这是本人写的以RS73编码来模拟CMMB的RS编码及字节交织-RS(7,3)编码和字节交织.rar

    这个压缩包文件“RS(7,3)编码和字节交织.rar”似乎包含了一个使用MATLAB编写的程序,该程序用于模拟中国移动多媒体广播(CMMB)标准中的RS(7,3)编码和字节交织过程。 RS(7,3)编码是一种特定的RS编码变体,其中“7”...

    单字节 多字节 双字节 相互转换

    单字节、多字节、双字节是三种常见的字符编码方式,它们之间的相互转换是非常必要的。 单字节(SBCS) 单字节字符编码(Single Byte Character Set,SBCS)是一种字符编码方式,每个字符只占用一个字节。这是最...

    多字节与UTF-8、Unicode之间的转换

    - 然后通过`WideCharToMultiByte`函数将宽字符字符串转换为多字节编码的字符串。 3. **MBToUnicode** 此函数负责将多字节编码转换为Unicode编码。转换过程类似于`MBToUTF8`,但最终的输出是Unicode编码而不是UTF...

    在vs2013中默认不再包含对多字节字符编码的支持

    标题中的“在vs2013中默认不再包含对多字节字符编码的支持”指的是Visual Studio 2013在默认配置下不再提供对多字节字符集(MBCS,Multi-Byte Character Set)的开箱即用支持。这在开发过程中可能会对处理非Unicode...

    易语言写出文件、写出字节集编码方式

    易语言写出文件、写出字节集编码方式

    字符和字节编码图解.xlsx

    字符和字节编码

    JAVA二进制字节数组字符十六进制BCD编码转换.doc

    在Java编程中,二进制、字节数组、字符、十六进制和BCD(Binary-Coded Decimal,二进制编码的十进制)编码转换是常见的数据处理任务。以下将详细介绍这些概念以及如何在Java中进行相关操作。 1. **二进制与十六进制...

    可变字节码

    然而,可变字节码并不局限于单个字节,它的核心在于根据数值的大小动态地选择字节数来编码,从而实现高效的数据压缩。 可变字节码的工作原理主要基于以下几点: 1. **编码规则**:对于小数值,可变字节码使用较少...

    易语言字节集头像编码

    在本案例中,"易语言字节集头像编码"指的是如何使用易语言来对头像(通常是图片文件)进行字节级的操作,从而实现编码和解码的过程。 首先,头像是指代表个人或角色的图像,通常用于社交媒体、聊天应用等平台的身份...

    字节、字符、编码的相关知识

    编码规则可以分为单字节编码、多字节编码和可变长度编码。单字节编码如ASCII,每个字符占用一个字节;多字节编码如ISO-2022-JP、Shift_JIS,根据字符的不同,占用1至n个字节;可变长度编码如UTF-8,根据字符的复杂...

    英文半字节压缩编码算法

    英文半字节压缩编码算法,采用C语言编写的,用于信息论与编码课程

    C++各种编码转换 Unicode UTF8

    以上四个部分分别详细解释了C++中常见字符编码之间的转换方法,包括多字节编码到UTF-8、UTF-8到多字节编码、多字节编码到Unicode以及Unicode到多字节编码的转换。这些转换过程对于处理不同系统或程序间的数据交互是...

    NetC# 获取字节流编码

    5. **编码转换**:在处理多语言或国际化文本时,可能会遇到不同编码的转换问题。`.NET`提供了多种编码类型,如`Encoding.ASCII`, `Encoding.BigEndianUnicode`, `Encoding.Unicode`, `Encoding.UTF7`, `Encoding.UTF...

    汉字编码问题编码问题

    GB2312采用了双字节编码方式,每个字符由两个字节表示,前一个字节称为高位字节,后一个字节称为低位字节。高位字节的范围在0xB0到0xF7之间,低位字节在0xA1到0xFE之间。 Unicode,又称万国码,是一种为全球所有...

    windows 系统文件 用于修改文档字节编码

    windows 系统文件 用于修改文档字节编码,iconv.exe的一般用法:iconv.exe -f gbk -t utf-8 gbk.txt > utf-8.txt。其中 -f gbk 指明转换前的文件编码是gbk,-t utf-8 指明转换后的文件编码是utf-8,gbk.txt 是转换前...

Global site tag (gtag.js) - Google Analytics