字符编码问题学习笔记
本文主要讨论几种常见的编码方式以及相互关系
(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学习笔记 1、连接数据库步骤 2、不同数据库的驱动程序和连接字符串 3、连接数据库常见问题 4、B/S结构和C/S结构的区别 5、如何处理中文乱码问题 6、使用JavaMail发送注册验证邮件 7、不安全的用户名密码验证 8、...
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写...
刚开始学习python,附件是本人python学习笔记记录,包括字符编码、格式化、字符串、条件判断和循环、函数等内容
Python学习笔记(⼀) 学习笔记(⼀) 之前没有养成习惯,以后学习Python会在这⾥做好记录。 本节只记录学习过程中的⾃认为的关键点。 ⼀.安装环境 直接从Python3.0上⼿, 具体的IDE使⽤的官⽹推荐的Pycharm,安装包...
《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、操作、应用或认证考试上的各种问题及解决方案。 《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE...
但 iconv 只能解决编码预先知道的情况,如果字符串编码未知,则需要先探测其编码,这时可能会用到 mb_string 扩展库: 复制代码 代码如下:mb_detect_encoding(‘软件开发网’); 可是 mb_detect_encoding 存在一个...
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...
答:string str = null 是不给他分配内存空间,而string str = \"\" 给它分配长度为空字符串的内存空间。 25.请详述在dotnet中类(class)与结构(struct)的异同? 答:Class可以被实例化,属于引用类型,是分配在内存的...
JAVA学习笔记第十四天——字符集编码解码、泛型的使用、数据结构栈和链表、集合框架&List,示例代码,里面主要是知识点的具体使用和各种现象。
给大家分享一篇我之前在学习java过程中的关于java基础部分的笔记,比较详细,内容也比较多。 如有问题请指出以便修改,谢谢。 篇幅较长建议收藏浏览。 1 环境变量配置 JAVA_HOME:jdk路径 Path:要把jdk的bin目录...
SpringCloud学习笔记1. maven父子项目父工程配置新项目,maven,父工程名称字符编码,设置,编辑器文件编码注解功效激活java编译选择1.8 文件类型文件过滤删除掉父工程下的src,只保留一个pom.xml父工程的pom.xml...
robotframework学习笔记之 学习笔记之———变量 变量 Robot Framework的变量分为标量, 列表和字典, 分别使⽤语法格式 ${SCALAR}, @{LIST} 和 &{DICT} 来定义。 此外, 环境变量可以直接使⽤语法 %{ENV_VAR} 来获取。...
-encoding <编码> 指定源文件使用的字符编码 -source <版本> 提供与指定版本的源兼容性 -target <版本> 生成特定 VM 版本的类文件 -version 版本信息 -help 输出标准选项的提要 -Akey[=value] 传递给注释处理...
对Java学习者很有用,集合、IO/字符编码、网络编程、语法
我们有多种方式获取对象的改变,如[委托、通知](https://github.com/pro648/tips/wiki/委托、通知传值的...这个demo主要以字符串、数组为例来学习键值编码和键值观察。 详细介绍查看下面文章: 源码地址:
oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
一、编码 默认情况下,Python 3 源码文件为 UTF-8 编码,所有字符串都是万国码 unicode 字符串。 二、变量(variable)和标识符 字面量:就是一个一个的值,如 1、2、3、 'world' ,就是它自己本身表达的 字面值、字面...