【java解惑】字符串的字节数组构造函数使用

如下代码:

public class Example018 {

	public static void main(String[] args) {
		byte bs[] = new byte[256];
		for (int i = 0; i < 256; i++) {
			bs[i] = (byte) i;
		}
		string(bs);// 调用1
		string(bs, "iso-8859-1");// 调用2
		string(bs, "gbk");// 调用3
		string(bs, "utf-8");// 调用4
	}

	static void string(byte[] bs) {
		String str = new String(bs); // 使用String(byte[])构造函数
		for (int i = 0, length = bs.length; i < length; i++) {
			System.out.print((int) str.charAt(i) + " ");
		}
	}

	static void string(byte[] bs, String charset) {
		try {
			String str = new String(bs, charset);// 使用String(byte[],charset)构造函数
			for (int i = 0, length = bs.length; i < length; i++) {
				System.out.print((int) str.charAt(i) + " ");
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}

    结果说明:

    在上述代码中,除了调用2可以正确编译并执行得到意料结果以外,其他的三个调用都不会正确执行。


    结果分析:

    上述代码的四个调用都使用了字符串的字节数组构造函数。在API中,对这个构造函数的描述是:在通过解码使用平台缺省字符集的指定byte 数组来构造一个新的String 时,该新String 的长度是字符集的一个函数,因此,它可能不等于 byte 数组的长度。当给定的所有字节在缺省字符集中并非全部有效时,这个构造器的行为是不确定的。

    ISO-8859-1 是唯一能够让上述程序按顺序打印从0到255的整数的缺省字符集,它更为大家所熟知的名字是Latin-1。

事实+:

    字符集:被编码的字符集合和字符编码模式的结合物。换句话说,字符集是一个包,包含了字符、表示字符的数字编码以及在字符编码序列和字节序列之间来回转换的方式。转换模式在字符集之间存在着很大的区别:某些是在字符和字节之间做一对一的映射,但是大多数都不是这样。 

  • ISO-8859-1:最早的编码,和ASCII编码相似。属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列,无法表示中文。
  • GB2312/GBK:专门用来表示汉字,是双字节编码,而英文字母和ISO-8859-1一致(兼容ISO-8859-1编码)。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK是兼容GB2312编码的。 
  • UNICODE:最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,不兼容ISO-8859-1。
  • UTF:由于UNICODE编码不兼容ISO-8859-1,而且容易占用更多的空间,所以UNICODE不便于传输和存储,因此而产生了UTF编码,UTF编码兼容ISO-8859-1编码,同时也可以用来表示所有语言的字符。UTF编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,UTF编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。



    参考资料:

1、http://blog.csdn.net/xiongchao2011/article/details/7276834

2、http://www.blogjava.net/thisliy/archive/2009/12/09/305313.html

3、http://bbs.csdn.net/topics/350128607

 


(注:本【java解惑】系列,均是博主阅读《java解惑》原书后,将原书上的讲解和例子部分改编,然后写成博文进行发布的。所有例子均亲自测试通过,并共享在github上。通过这些例子,激励自己,惠及他人。同时,本系列所有博文会同步发布在博主个人微信公众号(搜索“爱题猿”或者“ape_it”),方便大家阅读。如果文中有任何侵犯原作者权利的内容,请及时告知博主,以便及时删除;如果读者对文中的内容有异议或者问题,欢迎通过博客留言或者微信公众号留言等方式共同探讨。)

源代码地址:https://github.com/rocwinger/java-disabuse

时间: 2024-10-01 20:56:15

【java解惑】字符串的字节数组构造函数使用的相关文章

java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等

原文:java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等 源代码下载:http://www.zuidaima.com/share/1550463397366784.htm ava 常用流处理工具 StreamTool ,常见的InputStream 流转字符串, 转字节数组等等 **应用场景: ** 1. 文件上传 2. js / css / img 等文件读取输出. 转字符串输出 (js & css) , 转字节数组输出 (img .. swf

C# 字符串与字节数组相互转换

总结归纳:如果直接从System.String类中找到方法进行字符串和字节数组之间的转换,是不太可能的.为了使其之间进行转换,需要借助另外一个类型:System.Text.Encoding.这个类型提供了将C#字符串转换成字节数组的方法,也提供了将C# 字节数组转换成字符串. System.Text.Encoding类型的默认构造函数不太可用,不过该类型提供了几种默认的静态属性.如下: 1 // 2 // 摘要: 3 // 获取 ASCII(7 位)字符集的编码. 4 // 5 // 返回结果:

C# 16进制与字符串、字节数组之间的转换

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Con

C# 16进制与字符串、字节数组之间的转换(转)

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+C

Java中文件与字节数组转换

注:来源于JavaEye 文件转化为字节数组: http://www.javaeye.com/topic/304980 [c-sharp] view plaincopy /** * 文件转化为字节数组 * * @param file * @return */ public static byte[] getBytesFromFile(File file) { byte[] ret = null; try { if (file == null) { // log.error("helper:the

C#串口通讯,16进制与字符串、字节数组之间的转换。

1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2));//十进制转八进制Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8));//十进制转十六进制Console.WriteLine("十进制166的十六进制表示: "+Convert.ToStrin

打印机打印字符串转字节数组截取半个中文导致的乱码问题

打印机打印的时候  要求:打印一行文字,但这行文字实际长度 len(单位是:px)是固定的 这时候我们的思路是  :GBK编码下汉字占用两个字节,而且这两个字节都是负数,char型字符占用一个字节, 每个汉字占用的宽度是24px   每个char型占用的宽度是12px    换言之每个字节占用的打印宽度是12px 本行所容纳的字节个数 num=len / 12: 这时候我们将字符串转为字节数组  截取num个字节放到字节数组,然后转为字符串就是该行打印的字符串 但是有个问题就是 当我们截取的最后

Java文件与io——字节数组流数据流字符串流

字节数组流 ByteArrayInputStream:包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪read方法要提供的下一个字节.关闭ByteArrayInputStream无效.此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException. ByteArrayOutputStream:此类中实现了一个输出流.其中的数据被写入一个byte数组.缓冲区会随着数据的不断写入而自动增长.可使用toByteArray()和toString()获取数据.关闭ByteArra

python 字符串转字节数组

场景: java加解密和python加解密互转的时候,因一些非显示字符无法确认两者是否一致,故需要打出他们的十六进制字节数组进行比较 1.python代码实现 str='123';print str.encode('hex') 结果显示:313233 2. java实现 String str="123"; StringBuffer sbf=new StringBuffer(); for(int i=0;i<str.length();i++){ Integer tmp=(int)s