`

java字符编码相关

阅读更多

JAVA中转义字符: 

1.八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377' 
      \0:空字符 
2.Unicode转义字符:\u + 四个十六进制数字;0~65535 
     \u0000:空字符 
3.特殊字符:就3个 
      \":双引号 
     \':单引号 
     \\:反斜线 
4.控制字符:5个 
  
\' 单引号字符 

\\ 反斜杠字符 

\r 回车 

\n 换行 

\f 走纸换页 

\t 横向跳格 

\b 退格 

点的转义:. ==> u002E 
美元符号的转义:$ ==> u0024 
乘方符号的转义:^ ==> u005E 
左大括号的转义:{ ==> u007B 
左方括号的转义:[ ==> u005B 
左圆括号的转义:( ==> u0028 
竖线的转义:| ==> u007C 
右圆括号的转义:) ==> u0029 
星号的转义:* ==> u002A 
加号的转义:+ ==> u002B 
问号的转义:? ==> u003F 
反斜杠的转义: ==> u005C 

 

 

Java对在字符串字面常量中的Unicode转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前,先将Unicode转义字符转换成为它们所表示的字符[JLS 3.2]。因此,程序中的第一个Unicode转义字符将作为一个单字符字符串字面常量("a")的结束引号,而第二个Unicode转义字符将作为另一个单字符字符串字面常量("b")的开始引号。程序打印的是表达式"a".length()+"b".length(),即2。 

 

许多字符都有相应的转义字符序列,包括单引号(\')、换行(\n)、制表符(\t)和反斜线(\\)。你可以在字符字面常量和字符串字面常量中使用转义字符序列。 
实际上,你可以通过使用被称为八进制转义字符的特殊类型的转义字符序列,将任何ASCII字符置于一个字符串字面常量或一个字符字面常量中,但是最好是尽可能地使用普通的转义字符序列。 

普通的转义字符序列和八进制转义字符都比Unicode转义字符要好得多,因为与Unicode转义字符不同,转义字符序列是在程序被解析为各种符号之后被处理的。 

ASCII是字符集的最小公共特性集,它只有128个字符,但是Unicode有超过65,000个字符。一个Unicode转义字符可以被用来在只使用ASCII字符的程序中插入一个Unicode字符。一个Unicode转义字符精确地等价于它所表示的字符。 

Unicode转义字符被设计为用于在程序员需要插入一个不能用源文件字符集表示的字符的情况。它们主要用于将非ASCII字符置于标识符、字符串字面常量、字符字面常量以及注释中。偶尔地,Unicode转义字符也被用来在看起来颇为相似的数个字符中明确地标识其中的某一个,从而增加程序的清晰度。

 

hello world

 

 

/**
 * Generated by the IBM IDL-to-Java compiler, version 1.0
 * from F:\TestRoot\apps\a1\units\include\PolicyHome.idl
 * Wednesday, June 17, 1998 6:44:40 o’clock AM GMT+00:00
 */
public class Test{
    public static void main(String[] args){
        System.out.print("Hell");
        System.out.println("o world");
    }
}
 

 

 

注意\units 不是合法的unicode转义形式,所以编译不会通过。

这些字符以反斜杠(\)以及紧跟着的字母u开头的,而它(\u)表示的是一个Unicode转义字符的开始。遗憾的是,这些字符后面没有紧跟四个十六进制的数字,因此,这个Unicode转义字符是病构的,而编译器则被要求拒绝该程序。Unicode转义字符必须是良构的,即使是出现在注释中也是如此。 

在注释中插入一个良构的Unicode转义字符是合法的,但是我们几乎没有什么理由去这么做。程序员有时会在JavaDoc注释中使用Unicode转义字符来在文档中生成特殊的字符。 

 

总之,要确保字符\u不出现在一个合法的Unicode转义字符上下文之外,即使是在注释中也是如此。在机器生成的代码中要特别注意此问题。 

 

到底什么是字符集?从技术角度上讲,它是“被编码的字符集合和字符编码模式的结合物”[Java-API]。换句话说,字符集是一个包,包含了字符、表示字符的数字编码以及在字符编码序列和字节序列之间来回转换的方式。转换模式在字符集之间存在着很大的区别:某些是在字符和字节之间做一对一的映射,但是大多数都不是这样。ISO-8859-1是唯一能够让该程序按顺序打印从0到255的整数的缺省字符集,它更为大家所熟知的名字是Latin-1[ISO-8859-1]。 

J2SE运行期环境(JRE)的缺省字符集依赖于底层的操作系统和语言。如果你想知道你的JRE的缺省字符集,并且你使用的是5.0或更新的版本,那么你可以通过调用java.nio.charset.Charset.defaultCharset()来了解。如果你使用的是较早的版本,那么你可以通过阅读系统属性“file.encoding”来了解。 

幸运的是,你没有被强制要求必须去容忍各种稀奇古怪的缺省字符集。当你在char序列和byte序列之间做转换时,你可以且通常是应该显式地指定字符集。除了接受byte数字之外,还可以接受一个字符集名称的String构造器就是专为此目的而设计的。如果你用下面的构造器去替换在最初的程序中的String构造器,那么不管缺省的字符集是什么,该程序都保证能够按照顺序打印从0到255的整数: 

 

String str = new String(bytes, "ISO-8859-1");
 

 

这个构造器声明会抛出UnsupportedEncodingException异常,因此你必须捕获它,或者更适宜的方式是声明main方法将抛出它,要不然程序不能通过编译。尽管如此,该程序实际上不会抛出异常。Charset的规范要求Java平台的每一种实现都要支持某些种类的字符集,ISO-8859-1就位列其中。 
这个谜题的教训是:每当你要将一个byte序列转换成一个String时,你都在使用某一个字符集,不管你是否显式地指定了它。如果你想让你的程序的行为是可预知的,那么就请你在每次使用字符集时都明确地指定。对API的设计者来说,提供这么一个依赖于缺省字符集的String(byte[])构造器可能并非是一个好主意。 

http://justjavac.iteye.com/blog/175266

分享到:
评论
1 楼 海云台119 2016-11-19  

“提供这么一个依赖于缺省字符集的String(byte[])构造器可能并非是一个好主意。”

相关推荐

Global site tag (gtag.js) - Google Analytics