Java代码使用Unicode字符集编写。
Java SE各版本使用的Unicode标准是不同的,当前SE版本使用的具体是哪个版本的Unicode标准,可以在类
Character
里找到
Unicode标准创建时,每个字符使用固定的16位字符进行编码。随着对各种语言的扩展支持,Unicode字符的编码开始超过16位。
当下合法的Unicode编码从
U+0000
到U+10FFFF
码元(code unit):一个16位的编码,如0x1234
码点(code point):一个Unicode字符的编码,如U+10FFFF
补充字符(supplementary characters)是指那些码点超过U+FFFF
的字符
为了也能只用16位编码表示这些补充字符,Unicode标准定义了UTF-16编码格式
UTF-16编码:
第一个16位码元来自
U+D800
到U+DBFF
,第二个16位码元来自U+DC00
到U+DFFF
U+0000
到U+FFFF
的普通字符,它的码元和码点是一样的:information_source: 因此在Java中,语义字符的确切名称叫做UTF-16码元(code unit),一个Unicode字符的确切名称叫做码点(code point)
==码元和码点示例==
public static void main(String[] args) {
String wang = "hi王?";
/* .length()返回码元的数量, .charAt()返回索引上的码元对应的字符 */
for (int i = 0; i < wang.length(); i++) {
/* 依次输出 h 68, i 69, 王 738b, ? d83d, ? dc0d */
System.out.println(wang.charAt(i) + " " + Integer.toHexString((char) wang.charAt(i)));
}
/* .codePointCount()返回码点的数量, .codePointAt()返回索引上的码点对应的字符 */
for (int i = 0; i < wang.codePointCount(0, wang.length()); i++) {
/* 依次输出 h 67, i 69, 王 738b, ? 1f40d */
int codePointAt = wang.codePointAt(i);
String str = new String(Character.toChars(codePointAt));
System.out.println(str + " " + Integer.toHexString(codePointAt));
}
}
Java中的原始的Unicode字符流根据下面的三个步骤被翻译成一系列的token
\uxxxx
被转换成对应的UTF-16的码元xxxx
Java编译器首先将代码中的\uxxxx
转换解释成对应的UTF-16编码格式的码元xxxx
,其他的字符不做处理。
解释成的字符不会参与到字符转义里,如\u005au005c
不会被解释成Z
。虽然\u005a
是Unicode字符\
,它被解释一次后,与后续字符组成的新字符\u005c
不会被解释成Z
。
这三个字符会被当作换行符被解释: ASCII字符 LF(newline), ASCII字符 CR(return), ASCII字符 CRLF
经过转义处理和换行处理后剩余的字符,就是input elements
input element = white space + comment + token token = identifier + keyword + literal + separator + operator
ASCII字符 SP(space), ASCII字符 HT(horizontal tab), ASCII字符 FF(form feed), 换行符
//
, /* */
, /** */
标识符是任意长度的Java字符和Java数字,首字母必须是Java字符
标识符不能是关键字、布尔类型值、null
Java字符是Character.isJavaIdentifierStart(int)
返回真值的字符,基本上所有的Unicode字符都是Java字符
Java字符或数字是
Character.isJavaIdentifierPart(int)
返回真值的字符
Java数字是0-9的数值(\u0030
- \u0039
)
Java有51个关键字
abstract continue for new switch
assert default if package synchronized
boolean do goto private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
_ (underscore)
字面量(literal)就是在代码里直接声明的初始类型值、String类型值、null
public void decimalLiteral(){
/* 十进制整形字面量 */
int intV1 = 324_330; long longV2 = 324_330L;
/* 十六进制整形字面量 */
int intV2 = 0x7FFF_FFFF; long longV2 = 0xFFFF_FFFF_FFFF;
/* 八进制整形字面量 */
int intV3 = 07777_7777; long longV3 = 07777_7777_7777;
/* 二进制整形字面量 */
int intV4 = 0b1111_1111; long longV4 = 0b1111_1010_1111;
}
public void floatLiteral() {
/* 十进制浮点数字面量 */
float floatV1 = 3.3e10F; double doubleV1 = 3.3e11;
/* 十六进制浮点数字面量 */
floatV1 = 0xffP+3F; doubleV1 = 0xffffp-3;
}
public void charLiteral() {
/* \是转义符 */
char c = 'a'; a = '\\'; a = '\'';
a = '\uFFFF'; a = '\177'
}
public void stringLiteral() {
String str = "Hello";
str = "\nhello"
}
Java中下面的12个字符是分隔符
( ) { } [ ] ; , . ... @ ::
Java中下面38个字符是操作符
= > < ! ~ ? : ->
== >= <= != && || ++ --
+ - * / & | ^ % << >> >>>
+= -= *= /= &= |= ^= %= <<= >>= >>>=
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。