`
marauder
  • 浏览: 4303 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

对java编码的总结

阅读更多

      总结下这两天对编码的认识一些认识,本文显得比较啰嗦,应为这是我探讨的整个流程结果,了解的有不对的地方多多指点出来! 

      不了解的相信你会有个不错的认解这是学习编程的一个开始,大家就多多帮村。

      在查看网上一些资料时候,首先第一个奇怪的现象出了,据说是移动打不过联通的根本原因。 
      如果你的电脑操作系统是win2000或winxp的话,那么: 
      1、在桌面上点右键,选择新建 - 文本文档; 
      2、打开“新建 文本文档“,录入“移动“两字后存盘退出; 
      3、重新打开“新建 文本文档“,看到什么了? 
      4、是不是刚刚录入的“移动“两字? 
      咱们换过来 
      1、在桌面上点右键,选择新建 - 文本文档; 
      2、打开“新建 文本文档“,录入“联通“两字后存盘退出; 
      3、重新打开“新建 文本文档“,看到什么了? 
      4、是不是刚刚录入的“联通“两字不见了,取而代之是个烧焦的手机电池的摸样? 
      呵呵,是不是很有趣,自己试一下,如果重新建个,除了键入“联通”还多敲几个字,“联通”又能正常显示啦。 
      (以下说的是中文的系统)这个道理还是挺明显的,简单的说文本他本身默认存入编码为GBK,但是“联通”二字的二进制格式跟utf-8编码的格式相同,所以再次打开的时候就是系统用了utf-8的格式去解读了gbk的文本,所以出现乱码。

 
      首先了解下上网了解下so8859-1,GB2312/GBK,unicode,utf-8,utf-16等编码的背景资料以及各自关系。 
      接下来自己又对了java编程做了些实验,我以“连通”二字做了实验,应为不想对不住联通,“连通”二字解成GBK二进制码后也是符合utf-8编码的二进制码格式。 这个问题晚上查一下一大堆,在这里就不多说了。
      接下来是探讨java运行时的编码转换,好,开始建立一个文本,输入“连通”二字,默认保存。 


      测试程序

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class Charset {
	public static void main(String[] str) {
		System.out.println(System.getProperty("file.encoding"));
		FileInputStream fis01;
		FileInputStream fis02;
		FileInputStream fis03;
		InputStreamReader isrUTF8;
		InputStreamReader isrGBK;
		BufferedReader brUTF8;
		BufferedReader brGBK;
		try {
			fis01 = new FileInputStream("E:\\试一下.txt");
			fis02 = new FileInputStream("E:\\试一下.txt");
			fis03 = new FileInputStream("E:\\试一下.txt");

			isrGBK = new InputStreamReader(fis02, "GBK");
			isrUTF8 = new InputStreamReader(fis01, "UTF-8");

			brGBK = new BufferedReader(isrGBK);
			brUTF8 = new BufferedReader(isrUTF8);

			int t = 0;
			String strGBK = brGBK.readLine();
			String strUTF8 = brUTF8.readLine();

			System.out.println("GBK的字节-----");
			byte[] b = strGBK.getBytes();
			for (int i = 0; i < b.length; i++) {
				System.out.println(b[i]);
			}
			System.out.println("-----");

			System.out.println("utf-8的字节-----");
			byte[] c = strUTF8.getBytes();
			for (int i = 0; i < c.length; i++) {
				System.out.println(c[i]);
			}
			System.out.println("-----");

			System.out.println("直接读取的字节-----");
			byte[] y = new byte[b.length];
			int f = fis03.read(y);
			for (int d = 0; d < y.length; d++) {
				System.out.println(y[d]);
			}
			System.out.println("-----");

			System.out.println("GBK:" + strGBK);
			System.out.println("UTF-8:" + strUTF8);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();

		}

	}
}

 很简单的一个程序,结果为

GBK
GBK的字节----- -63 -84 -51 -88
-----
utf-8的字节----- 63 63 63
-----
直接读取的字节----- -63 -84 -51 -88
-----
GBK:连通
UTF-8:???

 

如图运行过程如图:

 

 

     源代码为本机默认编码(即GBK),在读取二进制后通过,因为在Java 语言默认的编码方式是UNICODE,单我们读取一个文本时,首先读取二进制,通过isrGBK = new InputStreamReader(fis02, "GBK")用GBK编码将二进制码解析成UNICODE编码存在JVM虚拟内存里;当要打印输出,或是获取二进制码时,用byte[] b = strGBK.getBytes()(默认就是byte[] b = strGBK.getBytes(“gbk”)),UNICODE作为内存的与其他外来流的中间者沟通个个编码转换。

      如果不指定,就是默认编码就是GBK,一般情况下就是我们存的是“GBK”,读出来的也是“GBK”,所以一般情况下不会出现乱码问题,接下来把上面的文本在保存时指定存为UTF-8时,得到结果为

GBK
GBK的字节-----
-17 -69 -65 -24 -65 -98 -23 -128 63
-----
utf-8的字节----- 63 -63 -84 -51 -88
-----
直接读取的字节----- -17 -69 -65 -24 -65 -98 -23 -128 -102
-----

GBK:锘胯繛閫?
UTF-8:?连通

 

运行过程:

 

 

     可以看到,二进制 -17-69-65  这三个是编码标识符,说明这是一个UTF-8编码的文本,用UTF-8解析-24-65-98等于“连”,-23-128-102=“通。

 

总结就引用一下网上看到的一句话:

       事实上,世界上任何东西要与其他东西通信会话,都存在一个既定的协议,既定的编码。人与人之间通过文字联络,汉字“妈”代表生你的那个人,这就是一种既定的编码。但注意到这样一种情况,汉字“妈”在日本文字里有可能是你生下的那个人,所以当一个中国人A与日本B之间用“妈”这个字进行交流,出现误解就很正常的。用记事本打开二进制文件与上面的情况类似。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应嘛。

杂谈:

      由于自己写的还有些地方说得比较模糊,看了别人的文章,写得太好了 http://www.iteye.com/topic/311583内部很清晰,语言精炼标准。

      自己代码试出,原来utf-16就是unicode编码,应该是unicode字集开始时候只有unicode编码,但后来出现了utf-8编码,为了名字统一好看,给unicode编码多加了个名字叫utf-16编码。。

       接下网上查到:UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题。

      自己之前也混淆字符集跟编码两个概念,特地链接过来http://www.iteye.com/topic/317895

 

     

  • 大小: 16.7 KB
  • 大小: 21.8 KB
分享到:
评论

相关推荐

    java编码总结1

    【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...

    Java中编码总结.pdf

    GB18030是目前中国的国家编码标准,提供了对包括中文在内的多种语言字符的广泛支持。 在Java中,字符(Character)是基于Unicode的,而不同的字符集(CharacterSet)定义了如何将字符编码成字节序列。这些字符集...

    腾讯java编码规范

    腾讯 Java 编码规范 腾讯 Java 编码规范是腾讯集团管理标准的一部分,旨在确保公司项目代码的易维护性和编码安全性。该规范涵盖了 Java 编码风格、文件组织、代码风格、注释、命名、声明、异常、习惯等方面。 一、...

    java编码主要用于java编码

    以下是对Java编码相关知识点的详细说明: 1. **Java语法基础**:Java是一种面向对象的语言,其语法结构包括类、对象、包、接口、继承、多态等概念。基础语法包括变量声明、数据类型(如整型、浮点型、字符串型等)...

    Java编码规范总结

    文中部分节选 1.整型实例。 修复建议:使用Integer.valueOf()替代new Integer。 2.switch语句包含太少分支。 修复建议:分支比较少的时候建议使用if else。原因:switch用来处理多分支的情况。...

    Java中编码方式和Unicode知识总结

    以下是对Java中编码方式和Unicode的知识点总结: 1. 基本概念 - bit:计算机存储的最小单位,只能是0或者1。 - byte:一个字节是8个bit,计算机表示的基本单位。 - 字节换算:1KB(千字节)= 1024字节,1MB(兆字节...

    JAVA安全编码规范参考.pdf

    总结而言,该JAVA安全编码规范参考文档为开发者在编写安全的Java代码时提供了一套全面的指导方针,从基本原则到具体漏洞的解决办法,都有详细说明。遵守这些安全编码规范,能有效减少系统漏洞,提高Java应用的安全性...

    java编码注释和doc自动生成

    本文将详细介绍如何在Java编码中创建注释以及如何使用apidoc工具自动生成文档。 首先,Java提供了多种注释类型,包括单行注释、多行注释和Javadoc注释。单行注释以`//`开始,适用于快速添加临时或简单的说明。多行...

    java编码格式转换

    ### Java编码格式转换 在Java开发中,字符编码的转换是一项常见的需求,尤其是在处理国际化文本时。本文将详细介绍如何在不同的编码格式之间进行转换,并探讨一些常见的编码转换错误及其处理方法。 #### Unicode与...

    Java判断文件的编码

    ### Java判断文件编码的方法 在Java开发中,经常会遇到需要处理不同编码格式的文件的情况。为了确保程序能够正确解析文件内容,必须先判断文件的编码格式。本文将详细介绍如何使用Java来判断文件是否为UTF-8或GBK...

    java使用URLDecoder和URLEncoder对中文字符进行编码和解码

    1. `URLEncoder.encode`: 对普通字符串进行编码,使其适合在URL中传输。 2. `URLDecoder.decode`: 解码URL中的编码字符串,恢复原始的文本信息。 在处理网络请求、特别是涉及到中文字符和其他特殊字符时,这两个...

    Java编码规范2008版.pdf

    总结来说,Java编码规范是实现高质量Java代码的基础,涵盖了代码格式化、命名、排版、注释等多个方面。遵循这些规范,不仅有助于提升代码的可读性和可维护性,还能促进团队内部的协作效率,确保项目开发的标准化和...

    JAVA 转换字符编码工具

    总结来说,`JAVA 转换字符编码工具`是利用Java语言实现的字符编码转换程序,通过提供的源代码文件可以学习到如何在Java中进行编码转换操作,以及如何设计和测试这样的工具。这个工具对于处理多语言环境或跨平台通信...

    java字符串编码转换

    ### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...

    Java编码常犯错误

    以上总结了Java编码中常见的错误及其解决方案。通过遵循最佳实践和避免常见的陷阱,可以显著提高代码质量和系统的安全性及性能。开发者应当持续学习最新的技术趋势和最佳实践,以提升自己的编程水平。

    java使用Hex编码解码实现Aes加密解密功能示例

    总结来说,这个Java示例展示了如何使用Hex编码和解码配合AES加密算法进行数据安全保护。在实际应用中,为了提高安全性,通常会采用更复杂的加密模式(如CBC或CFB),并使用随机生成的密钥,而不是固定或硬编码的密钥...

    Java+编码规范+东软编码规范,项目规范

    下面将详细介绍Java编码规范以及东软在项目规范方面的部分要点。 1. **命名规范**: - 类名:使用大驼峰式命名,每个单词首字母大写,例如`MyClassName`。 - 变量名和方法名:使用小驼峰式命名,首个单词首字母...

Global site tag (gtag.js) - Google Analytics