`
etongg
  • 浏览: 14851 次
  • 性别: 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 字符串应用笔记"可能涵盖的基本知识点,对于初学者来说,理解和掌握这些概念是进阶学习Java和Android开发的基础。在实际开发中,还会涉及到更多高级特性和实践技巧,如字符串格式化、正则表达式...

    当年我学PHP时整理的学习笔记

    学习笔记通常包含概念解释、代码示例、常见问题解答等,可以帮助读者系统性地理解和掌握PHP的核心概念和技术。 【压缩包子文件的文件名称列表】: 1. **常用函数.php**:这部分内容可能包含了PHP中的常用内置函数,...

    Java学习笔记

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

    python学习笔记.pdf

    在这份《python学习笔记.pdf》中,记录了Python编程的基础知识和一些技巧,内容涵盖了字符串处理、变量操作、数据结构、循环、条件判断等方面。以下是对学习笔记中提到知识点的详细说明。 ### 字符串处理 在Python...

    C#字符串和正则表达式学习笔记

    在"C#字符串和正则表达式学习笔记.doc"这份文档中,你可能还会学到如何使用正则表达式进行高级匹配,例如使用捕获组和非捕获组,以及使用反向引用来引用先前匹配的子串。同时,可能会涉及到正则表达式的性能优化技巧...

    (初级)机器学习笔记一:python基础语法之数据类型和字符串

    本次笔记是关于Python语言基础知识中的数据类型和字符串操作,这是学习机器学习和数据科学的入门要点。 首先,Python的基本数据类型包括整型(int)、浮点型(float)、布尔型(bool)以及复数类型(complex),...

    超详细的web前端基础学习笔记

    - **`&lt;meta&gt;` 标签**:例如,设置浏览器的字符编码方式。 ##### HTML 中的常见标签 - **文本标签** - **标题标签** (`&lt;h1&gt;` 至 `&lt;h6&gt;`): 用于定义不同级别的标题。 - **段落标签** (`&lt;p&gt;`): 用于定义文本段落。 ...

    Freemarker 学习笔记一 【乱码解决】

    这篇学习笔记主要讨论如何解决Freemarker中的乱码问题。 首先,我们要理解乱码的产生原因。乱码通常是因为字符编码不一致导致的,例如,服务器端使用UTF-8编码,而客户端(浏览器)期望的是GBK编码。在Freemarker中...

    python学习笔记

    ### Python学习笔记知识点详解 #### 一、字符编码与Unicode **背景介绍:** 随着全球化的发展,各种语言的字符在互联网上的交流变得越来越频繁。早期的计算机系统采用各自国家的标准编码,导致多语言环境中出现...

    安卓学习笔记大全

    【安卓学习笔记详解】 在安卓开发的学习过程中,了解并掌握基本概念和技术是非常关键的。以下是一些核心知识点的详述: 1. **字符集与编码**:Android系统默认使用UTF-8编码,而不是iso-8859-1。当你使用`getBytes...

    python基础学习笔记(1)

    ### Python基础学习笔记知识点...以上内容涵盖了Python基础学习笔记中提及的主要知识点,这些知识点对于初学者来说非常重要,不仅有助于理解Python的基本语法和功能,还能帮助他们在实际编程过程中更高效地解决问题。

    python基础学习笔记

    在字符串处理方面,讲解了转义字符、原始字符串、索引、切片、编码转换、字符串构造函数等。 列表(list)是Python中非常灵活和常用的数据结构。笔记中详细说明了如何创建列表,列表的构造函数,列表的运算,以及...

    vb6.0 学习笔记

    VB6.0学习笔记 VB6.0是一种功能强大且广泛应用的编程语言,以下是VB6.0学习笔记的重要知识点总结: 编码规则 在VB6.0中,代码不区分大小写,这意味着开发者可以随意使用大写或小写字母编写代码。另外,当一条语句...

    android入门学习笔记

    ### Android入门学习笔记知识点梳理 #### 第四讲:Android应用中的资源管理与界面布局 **1. 显示“Hello World”的方法** - **资源管理**:在Android开发中,资源通常存储在`res`目录下,包括图片、布局文件、...

    python学习笔记ing

    ### Python学习笔记知识点详解 #### 数据类型与变量 在Python编程中,理解基本的数据类型及其操作至关重要。数据类型包括但不限于整型(`int`)、浮点型(`float`)、布尔型(`bool`)以及字符串(`str`)。变量则...

    JavaFX+Jfoenix 学习笔记(十)--系统托盘及解决中文乱码问题源码

    在本篇JavaFX+Jfoenix学习笔记中,我们将探讨如何在JavaFX应用程序中实现系统托盘功能,以及如何解决可能出现的中文乱码问题。系统托盘是现代桌面应用中常见的一种特性,允许用户在关闭主窗口后,仍然可以通过托盘...

    JS学习笔记(BOM,DOM,字符串方法等)

    常见的字符串方法包括`length`属性(返回字符串长度),`charAt()`(根据索引获取字符),`charCodeAt()`(获取字符的Unicode编码),以及`fromCharCode()`(根据Unicode编码创建字符)。 以上是JavaScript中的一些...

Global site tag (gtag.js) - Google Analytics