字符编码问题学习笔记
本文主要讨论几种常见的编码方式以及相互关系
(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和Android开发的基础。在实际开发中,还会涉及到更多高级特性和实践技巧,如字符串格式化、正则表达式...
学习笔记通常包含概念解释、代码示例、常见问题解答等,可以帮助读者系统性地理解和掌握PHP的核心概念和技术。 【压缩包子文件的文件名称列表】: 1. **常用函数.php**:这部分内容可能包含了PHP中的常用内置函数,...
Java学习笔记 1、连接数据库步骤 2、不同数据库的驱动程序和连接字符串 3、连接数据库常见问题 4、B/S结构和C/S结构的区别 5、如何处理中文乱码问题 6、使用JavaMail发送注册验证邮件 7、不安全的用户名密码验证 8、...
在这份《python学习笔记.pdf》中,记录了Python编程的基础知识和一些技巧,内容涵盖了字符串处理、变量操作、数据结构、循环、条件判断等方面。以下是对学习笔记中提到知识点的详细说明。 ### 字符串处理 在Python...
在"C#字符串和正则表达式学习笔记.doc"这份文档中,你可能还会学到如何使用正则表达式进行高级匹配,例如使用捕获组和非捕获组,以及使用反向引用来引用先前匹配的子串。同时,可能会涉及到正则表达式的性能优化技巧...
本次笔记是关于Python语言基础知识中的数据类型和字符串操作,这是学习机器学习和数据科学的入门要点。 首先,Python的基本数据类型包括整型(int)、浮点型(float)、布尔型(bool)以及复数类型(complex),...
- **`<meta>` 标签**:例如,设置浏览器的字符编码方式。 ##### HTML 中的常见标签 - **文本标签** - **标题标签** (`<h1>` 至 `<h6>`): 用于定义不同级别的标题。 - **段落标签** (`<p>`): 用于定义文本段落。 ...
这篇学习笔记主要讨论如何解决Freemarker中的乱码问题。 首先,我们要理解乱码的产生原因。乱码通常是因为字符编码不一致导致的,例如,服务器端使用UTF-8编码,而客户端(浏览器)期望的是GBK编码。在Freemarker中...
### Python学习笔记知识点详解 #### 一、字符编码与Unicode **背景介绍:** 随着全球化的发展,各种语言的字符在互联网上的交流变得越来越频繁。早期的计算机系统采用各自国家的标准编码,导致多语言环境中出现...
【安卓学习笔记详解】 在安卓开发的学习过程中,了解并掌握基本概念和技术是非常关键的。以下是一些核心知识点的详述: 1. **字符集与编码**:Android系统默认使用UTF-8编码,而不是iso-8859-1。当你使用`getBytes...
### Python基础学习笔记知识点...以上内容涵盖了Python基础学习笔记中提及的主要知识点,这些知识点对于初学者来说非常重要,不仅有助于理解Python的基本语法和功能,还能帮助他们在实际编程过程中更高效地解决问题。
在字符串处理方面,讲解了转义字符、原始字符串、索引、切片、编码转换、字符串构造函数等。 列表(list)是Python中非常灵活和常用的数据结构。笔记中详细说明了如何创建列表,列表的构造函数,列表的运算,以及...
VB6.0学习笔记 VB6.0是一种功能强大且广泛应用的编程语言,以下是VB6.0学习笔记的重要知识点总结: 编码规则 在VB6.0中,代码不区分大小写,这意味着开发者可以随意使用大写或小写字母编写代码。另外,当一条语句...
### Android入门学习笔记知识点梳理 #### 第四讲:Android应用中的资源管理与界面布局 **1. 显示“Hello World”的方法** - **资源管理**:在Android开发中,资源通常存储在`res`目录下,包括图片、布局文件、...
### Python学习笔记知识点详解 #### 数据类型与变量 在Python编程中,理解基本的数据类型及其操作至关重要。数据类型包括但不限于整型(`int`)、浮点型(`float`)、布尔型(`bool`)以及字符串(`str`)。变量则...
在本篇JavaFX+Jfoenix学习笔记中,我们将探讨如何在JavaFX应用程序中实现系统托盘功能,以及如何解决可能出现的中文乱码问题。系统托盘是现代桌面应用中常见的一种特性,允许用户在关闭主窗口后,仍然可以通过托盘...
常见的字符串方法包括`length`属性(返回字符串长度),`charAt()`(根据索引获取字符),`charCodeAt()`(获取字符的Unicode编码),以及`fromCharCode()`(根据Unicode编码创建字符)。 以上是JavaScript中的一些...