Java中char的编码方式与多语言区分
????? 大早上突然想起去年遇到的一个问题【如何在服务器端判断一个字符是中文字符还是英文字符】,当时google的各种资料解决的问题,但是现在想来,当时的那个方法还是有各种Bug, 于是就爬起来整理一下自己对Java中char这种基本的数据类型编码方式(String的底层也是char[]实现)的理解
?
==============================
华丽丽的分界线
=============================
?
Java中使用了Unicode编码方式
public static boolean isChineseCharacter(char ch){return (ch>=0x4E00)&&(ch<0x9FBF) ? true : false;}但是这种方式不能判断一些中文标点符号:
写道, : 0xff0c。 : 0x3002
、 : 0x3001
【 : 0x3010
‘ : 0x2018 (小于0x3000的字符应该都是比较窄的)
?
?
但是如果你不想针对除了中文、英文字符之外的其他字符进行特殊处理的话、 你可以把后面的那些偏门字符都当做中文字符(大多数情况下都不会遇到的、起码的国内。。。), 比如把大于0x3000的字符都当做中文字符、小于0x3000的字符都当做英文字符(不知道是否有错误。。。)
?
?
备注: 我们经常会发现这种情况。中文字符用char表示是2byte(即16bits)。但是如果用String的getBytes方法返回的byte数组查看有时就会发现它的长度是3byte(utf-8)、 而英文字符是1byte(用char表示是2byte)。
API给此的解释是:String的getBytes方法使用平台的默认字符集将String编码为byte序列。那么上述的字节长度变化应该是String使用当前环境的编码方式进行了编码得到的byte字符串(现在应该一般都是utf-8吧?如果是gbk的话应该还是2byte),这种编码仅仅是平台相关的而不是底层的(String内部的char[]没有发生变化,Java中基本数据类型的固定长度是平台无关的)。