`
etongg
  • 浏览: 14284 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

字符编码问题学习笔记

    博客分类:
  • java
阅读更多

字符编码问题学习笔记

 

本文主要讨论几种常见的编码方式以及相互关系

(ISO-8859-1、GBK、GB2312、GB18030、UTF-8、UTF-16、UTF-16BE、UTF-16LE)

 

ISO-8859-1:

ISO/IEC 8859-1 ,又称Latin-1 或“西欧语言”,是国际标准化组织ISO/IEC 8859 的第一个8位字符集。它以ASCII 为基础,在空置的0xA0-0xFF的范围内,加入92 个字母及符号,藉以供使用变音符号拉丁字母 语言使用。

详细介绍请看: http://wiki.ccw.com.cn/ISO_8859-1


GBK、GB2312、GB18030、BIG5:

GB2312对应的简体汉字的编码,而BIG5则对于繁体汉字的编码;GBK对简体繁体的汉字都做了编码,且向下兼容GB2312;GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。 GB18030 编码是一二四字节变长编码,GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。

详细介绍请看: http://blog.csdn.net/liujinchengjx/archive/2007/03/13/1527909.aspx

 

UTF-8、UTF-16、UTF-16BE、UTF-16LE:

详细介绍请看:http://blog.csdn.net/fmddlmyy/archive/2005/05/04/372148.aspx

 

 

附上一段代码,可以返回字符串在各种字符集下的编码值

D:\workspace\JavaBaseKnowledge\src>java CharsetTest "编码A"
字符串:[编码A]
===================================
java内码为:7f16 7801 41
字节数:5;编码:GB2312
字节数:5;编码:GBK
字节数:5;编码:GB18030
字节数:3;编码:ISO-8859-1
字节数:7;编码:UTF-8
字节数:8;编码:UTF-16
字节数:6;编码:UTF-16BE
字节数:6;编码:UTF-16LE
字节数:5;编码:defaulCharset
[编码A]在GB2312 下的字节码为:b1 e0 c2 eb 41
[编码A]在GBK    下的字节码为:b1 e0 c2 eb 41
[编码A]在GB18030        下的字节码为:b1 e0 c2 eb 41
[编码A]在ISO-8859-1     下的字节码为:3f 3f 41
[编码A]在UTF-8  下的字节码为:e7 bc 96 e7 a0 81 41
[编码A]在UTF-16 下的字节码为:fe ff 7f 16 78 1 0 41
[编码A]在UTF-16BE       下的字节码为:7f 16 78 1 0 41
[编码A]在UTF-16LE       下的字节码为:16 7f 1 78 41 0
[编码A]在defaulCharset  下的字节码为:b1 e0 c2 eb 41

从结果看:1.GB2312,GBK,GB18030汉字2个字节,英文一个字节;UTF-8汉字3个字节,英文一个字节。它们编码是变长的


        2.JAVA内码的编码类型为UTF-16BE

 import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class CharsetTest {

	private final static String DEFAULT_CHARSET = "defaulCharset";

	/** 常用字符集 */
	private final static String[] CHARSETNAME_ARRAY = { "GB2312", "GBK",
			"GB18030", "ISO-8859-1", "UTF-8", "UTF-16", "UTF-16BE", "UTF-16LE",
			DEFAULT_CHARSET };

	/**
	 * 打印字符串在指定编码下的字节数和编码名称到控制台
	 * 
	 * @param aStr
	 *            字符串
	 * @param aCharsetName
	 *            编码格式
	 */
	public static void printByteLength(String aStr, String aCharsetName) {
		System.out.print("字节数:");
		try {
			byte[] bytes;
			if (DEFAULT_CHARSET.equals(aCharsetName)) {
				bytes = aStr.getBytes();
			} else {
				bytes = aStr.getBytes(aCharsetName);
			}
			System.out.print(bytes.length);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(";编码:" + aCharsetName);
	}

	/**
	 * 打印字符串在常用编码下的字节数和编码名称到控制台
	 * 
	 * @param aStr
	 *            字符串
	 */
	public static void printByteLength(String aStr) {
		for (String aCharsetName : CHARSETNAME_ARRAY) {
			printByteLength(aStr, aCharsetName);
		}
	}

	/**
	 * 打印字符串在指定编码下的字节码,16进制表示
	 * 
	 * @param aStr
	 *            字符串
	 * @param aCharsetName
	 *            编码格式
	 */
	public static void printByte(String aStr, String aCharsetName) {
		System.out.print("[" + aStr + "]在" + aCharsetName + "\t下的字节码为:");
		try {
			byte[] bytes;
			if (DEFAULT_CHARSET.equals(aCharsetName)) {
				bytes = aStr.getBytes();
			} else {
				bytes = aStr.getBytes(aCharsetName);
			}
			List<String> byteStrs = getByteStr(bytes);
			System.out.print(join(byteStrs, " "));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println();
	}

	public static List<String> getByteStr(byte[] bytes) {
		List<String> byteStrs = new ArrayList<String>();
		for (byte aByte : bytes) {
			String hexString = Integer.toHexString(aByte & 0xFF);
			//String hexString = Integer.toString(aByte & 0xFF);
			//String hexString = Byte.toString(aByte);
			byteStrs.add(hexString);
		}
		return byteStrs;
	}

	/**
	 * 打印字符串在常用编码下的字节码,16进制表示
	 * 
	 * @param aStr
	 *            字符串
	 */
	public static void printByte(String aStr) {
		for (String aCharsetName : CHARSETNAME_ARRAY) {
			printByte(aStr, aCharsetName);
		}
	}

	/**
	 * 打印字符串在java默认编码下的字符串,16进制表示
	 * 
	 * @param aStr
	 *            字符串
	 */
	public static void printJavaInnerUnicode(String aStr) {
		System.out.print("java内码为:");
		for (int i = 0, length = aStr.length(); i < length; i++) {
			char aChar = aStr.charAt(i);
			String yingHex = Integer.toHexString(aChar);
			System.out.print(yingHex + " ");
		}
		System.out.println();
	}

	public static <T> String join(final Collection<T> objs,
			final String delimiter) {
		if (objs == null || objs.isEmpty())
			return "";
		Iterator<T> iter = objs.iterator();
		StringBuffer buffer = new StringBuffer(iter.next().toString());
		while (iter.hasNext())
			buffer.append(delimiter).append(iter.next().toString());
		return buffer.toString();
	}

	public static void main(String[] args) {
		if (args.length == 0) {
			String usage = "Usage: java CharsetTest inputString";
			System.out.println(usage);
			return;
		}
		String ch = args[0];

		System.out.println("字符串:[" + ch
				+ "]\n===================================");
		printJavaInnerUnicode(ch);
		CharsetTest.printByteLength(ch);
		CharsetTest.printByte(ch);
	}

}

 

 

 

 

 

分享到:
评论

相关推荐

    Java学习笔记

    Java学习笔记 1、连接数据库步骤 2、不同数据库的驱动程序和连接字符串 3、连接数据库常见问题 4、B/S结构和C/S结构的区别 5、如何处理中文乱码问题 6、使用JavaMail发送注册验证邮件 7、不安全的用户名密码验证 8、...

    字符编码学习

    上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写...

    python学习笔记

    刚开始学习python,附件是本人python学习笔记记录,包括字符编码、格式化、字符串、条件判断和循环、函数等内容

    Python学习笔记(一).pdf

    Python学习笔记(⼀) 学习笔记(⼀) 之前没有养成习惯,以后学习Python会在这⾥做好记录。 本节只记录学习过程中的⾃认为的关键点。 ⼀.安装环境 直接从Python3.0上⼿, 具体的IDE使⽤的官⽹推荐的Pycharm,安装包...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、操作、应用或认证考试上的各种问题及解决方案。  《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE...

    PHP学习笔记之字符串编码的转换和判断

    但 iconv 只能解决编码预先知道的情况,如果字符串编码未知,则需要先探测其编码,这时可能会用到 mb_string 扩展库: 复制代码 代码如下:mb_detect_encoding(‘软件开发网’); 可是 mb_detect_encoding 存在一个...

    python基础学习笔记整理

    2.1.5、字符编码与文件操作 2.1.6、可迭代对象、迭代器、生成器 2.2、封装 2.2.1、面向对象编程 2.2.2、类的继承与派生 2.2.3、封装、反射、单例、元类 2.2.4、模块编程(工具类) 2.3、网络编程 2.4、并发编程 2.5...

    net学习笔记及其他代码应用

    答:string str = null 是不给他分配内存空间,而string str = \"\" 给它分配长度为空字符串的内存空间。 25.请详述在dotnet中类(class)与结构(struct)的异同? 答:Class可以被实例化,属于引用类型,是分配在内存的...

    JAVA学习笔记第十四天

    JAVA学习笔记第十四天——字符集编码解码、泛型的使用、数据结构栈和链表、集合框架&List,示例代码,里面主要是知识点的具体使用和各种现象。

    记录所有有关java的学习笔记.rar

    给大家分享一篇我之前在学习java过程中的关于java基础部分的笔记,比较详细,内容也比较多。 如有问题请指出以便修改,谢谢。 篇幅较长建议收藏浏览。 1 环境变量配置 JAVA_HOME:jdk路径 Path:要把jdk的bin目录...

    spring-cloud:springCloud学习笔记

    SpringCloud学习笔记1. maven父子项目父工程配置新项目,maven,父工程名称字符编码,设置,编辑器文件编码注解功效激活java编译选择1.8 文件类型文件过滤删除掉父工程下的src,只保留一个pom.xml父工程的pom.xml...

    robotframework学习笔记之———变量.pdf

    robotframework学习笔记之 学习笔记之———变量 变量 Robot Framework的变量分为标量, 列表和字典, 分别使⽤语法格式 ${SCALAR}, @{LIST} 和 &{DICT} 来定义。 此外, 环境变量可以直接使⽤语法 %{ENV_VAR} 来获取。...

    corejava的学习笔记

    -encoding &lt;编码&gt; 指定源文件使用的字符编码 -source &lt;版本&gt; 提供与指定版本的源兼容性 -target &lt;版本&gt; 生成特定 VM 版本的类文件 -version 版本信息 -help 输出标准选项的提要 -Akey[=value] 传递给注释处理...

    JavaSE学习笔记

    对Java学习者很有用,集合、IO/字符编码、网络编程、语法

    ios-KVC和KVO学习笔记.zip

    我们有多种方式获取对象的改变,如[委托、通知](https://github.com/pro648/tips/wiki/委托、通知传值的...这个demo主要以字符串、数组为例来学习键值编码和键值观察。 详细介绍查看下面文章: 源码地址:

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    1.Python3基础语法学习笔记教程.pdf

    一、编码 默认情况下,Python 3 源码文件为 UTF-8 编码,所有字符串都是万国码 unicode 字符串。 二、变量(variable)和标识符 字面量:就是一个一个的值,如 1、2、3、 'world' ,就是它自己本身表达的 字面值、字面...

Global site tag (gtag.js) - Google Analytics