大早上突然想起去年遇到的一个问题【如何在服务器端判断一个字符是中文字符还是英文字符】,当时google的各种资料解决的问题,但是现在想来,当时的那个方法还是有各种Bug, 于是就爬起来整理一下自己对Java中char这种基本的数据类型编码方式(String的底层也是char[]实现)的理解
==============================
华丽丽的分界线
=============================
Java中使用了Unicode编码方式
Unicode表 写道
0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin)
0080-00FF:C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)
0100-017F:拉丁文扩展-A (Latin Extended-A)
0180-024F:拉丁文扩展-B (Latin Extended-B)
0250-02AF:国际音标扩展 (IPA Extensions)
02B0-02FF:空白修饰字母 (Spacing Modifiers)
0300-036F:结合用读音符号 (Combining Diacritics Marks)
0370-03FF:希腊文及科普特文 (Greek and Coptic)
0400-04FF:西里尔字母 (Cyrillic)
0500-052F:西里尔字母补充 (Cyrillic Supplement)
0530-058F:亚美尼亚语 (Armenian)
0590-05FF:希伯来文 (Hebrew)
0600-06FF:阿拉伯文 (Arabic)
0700-074F:叙利亚文 (Syriac)
0750-077F:阿拉伯文补充 (Arabic Supplement)
0780-07BF:马尔代夫语 (Thaana)
07C0-077F:西非書面語言 (N'Ko)
0800-085F:阿维斯塔语及巴列维语 (Avestan and Pahlavi)
0860-087F:Mandaic
0880-08AF:撒马利亚语 (Samaritan)
0900-097F:天城文书 (Devanagari)
0980-09FF:孟加拉语 (Bengali)
0A00-0A7F:锡克教文 (Gurmukhi)
0A80-0AFF:古吉拉特文 (Gujarati)
0B00-0B7F:奥里亚文 (Oriya)
0B80-0BFF:泰米尔文 (Tamil)
0C00-0C7F:泰卢固文 (Telugu)
0C80-0CFF:卡纳达文 (Kannada)
0D00-0D7F:德拉维族语 (Malayalam)
0D80-0DFF:僧伽罗语 (Sinhala)
0E00-0E7F:泰文 (Thai)
0E80-0EFF:老挝文 (Lao)
0F00-0FFF:藏文 (Tibetan)
1000-109F:缅甸语 (Myanmar)
10A0-10FF:格鲁吉亚语 (Georgian)
1100-11FF:朝鲜文 (Hangul Jamo)
1200-137F:埃塞俄比亚语 (Ethiopic)
1380-139F:埃塞俄比亚语补充 (Ethiopic Supplement)
13A0-13FF:切罗基语 (Cherokee)
1400-167F:统一加拿大土著语音节 (Unified Canadian Aboriginal Syllabics)
1680-169F:欧甘字母 (Ogham)
16A0-16FF:如尼文 (Runic)
1700-171F:塔加拉语 (Tagalog)
1720-173F:Hanunóo
1740-175F:Buhid
1760-177F:Tagbanwa
1780-17FF:高棉语 (Khmer)
1800-18AF:蒙古文 (Mongolian)
18B0-18FF:Cham
1900-194F:Limbu
1950-197F:德宏泰语 (Tai Le)
1980-19DF:新傣仂语 (New Tai Lue)
19E0-19FF:高棉语记号 (Kmer Symbols)
1A00-1A1F:Buginese
1A20-1A5F:Batak
1A80-1AEF:Lanna
1B00-1B7F:巴厘语 (Balinese)
1B80-1BB0:巽他语 (Sundanese)
1BC0-1BFF:Pahawh Hmong
1C00-1C4F:雷布查语(Lepcha)
1C50-1C7F:Ol Chiki
1C80-1CDF:曼尼普尔语 (Meithei/Manipuri)
1D00-1D7F:语音学扩展 (Phonetic Extensions)
1D80-1DBF:语音学扩展补充 (Phonetic Extensions Supplement)
1DC0-1DFF:结合用读音符号补充 (Combining Diacritics Marks Supplement)
1E00-1EFF:拉丁文扩充附加 (Latin Extended Additional)
1F00-1FFF:希腊语扩充 (Greek Extended)
2000-206F:常用标点 (General Punctuation)
2070-209F:上标及下标 (Superscripts and Subscripts)
20A0-20CF:货币符号 (Currency Symbols)
20D0-20FF:组合用记号 (Combining Diacritics Marks for Symbols)
2100-214F:字母式符号 (Letterlike Symbols)
2150-218F:数字形式 (Number Form)
2190-21FF:箭头 (Arrows)
2200-22FF:数学运算符 (Mathematical Operator)
2300-23FF:杂项工业符号 (Miscellaneous Technical)
2400-243F:控制图片 (Control Pictures)
2440-245F:光学识别符 (Optical Character Recognition)
2460-24FF:封闭式字母数字 (Enclosed Alphanumerics)
2500-257F:制表符 (Box Drawing)
2580-259F:方块元素 (Block Element)
25A0-25FF:几何图形 (Geometric Shapes)
2600-26FF:杂项符号 (Miscellaneous Symbols)
2700-27BF:印刷符号 (Dingbats)
27C0-27EF:杂项数学符号-A (Miscellaneous Mathematical Symbols-A)
27F0-27FF:追加箭头-A (Supplemental Arrows-A)
2800-28FF:盲文点字模型 (Braille Patterns)
2900-297F:追加箭头-B (Supplemental Arrows-B)
2980-29FF:杂项数学符号-B (Miscellaneous Mathematical Symbols-B)
2A00-2AFF:追加数学运算符 (Supplemental Mathematical Operator)
2B00-2BFF:杂项符号和箭头 (Miscellaneous Symbols and Arrows)
2C00-2C5F:格拉哥里字母 (Glagolitic)
2C60-2C7F:拉丁文扩展-C (Latin Extended-C)
2C80-2CFF:古埃及语 (Coptic)
2D00-2D2F:格鲁吉亚语补充 (Georgian Supplement)
2D30-2D7F:提非纳文 (Tifinagh)
2D80-2DDF:埃塞俄比亚语扩展 (Ethiopic Extended)
2E00-2E7F:追加标点 (Supplemental Punctuation)
2E80-2EFF:CJK 部首补充 (CJK Radicals Supplement)
2F00-2FDF:康熙字典部首 (Kangxi Radicals)
2FF0-2FFF:表意文字描述符 (Ideographic Description Characters)
3000-303F:CJK 符号和标点 (CJK Symbols and Punctuation)
3040-309F:日文平假名 (Hiragana)
30A0-30FF:日文片假名 (Katakana)
3100-312F:注音字母 (Bopomofo)
3130-318F:朝鲜文兼容字母 (Hangul Compatibility Jamo)
3190-319F:象形字注释标志 (Kanbun)
31A0-31BF:注音字母扩展 (Bopomofo Extended)
31C0-31EF:CJK 笔画 (CJK Strokes)
31F0-31FF:日文片假名语音扩展 (Katakana Phonetic Extensions)
3200-32FF:封闭式 CJK 文字和月份 (Enclosed CJK Letters and Months)
3300-33FF:CJK 兼容 (CJK Compatibility)
3400-4DBF:CJK 统一表意符号扩展 A (CJK Unified Ideographs Extension A)
4DC0-4DFF:易经六十四卦符号 (Yijing Hexagrams Symbols)
4E00-9FBF:CJK 统一表意符号 (CJK Unified Ideographs)
A000-A48F:彝文音节 (Yi Syllables)
A490-A4CF:彝文字根 (Yi Radicals)
A500-A61F:Vai
A660-A6FF:统一加拿大土著语音节补充 (Unified Canadian Aboriginal Syllabics Supplement)
A700-A71F:声调修饰字母 (Modifier Tone Letters)
A720-A7FF:拉丁文扩展-D (Latin Extended-D)
A800-A82F:Syloti Nagri
A840-A87F:八思巴字 (Phags-pa)
A880-A8DF:Saurashtra
A900-A97F:爪哇语 (Javanese)
A980-A9DF:Chakma
AA00-AA3F:Varang Kshiti
AA40-AA6F:Sorang Sompeng
AA80-AADF:Newari
AB00-AB5F:越南傣语 (Vi?t Thái)
AB80-ABA0:Kayah Li
AC00-D7AF:朝鲜文音节 (Hangul Syllables)
D800-DBFF:High-half zone of UTF-16
DC00-DFFF:Low-half zone of UTF-16
E000-F8FF:自行使用區域 (Private Use Zone)
F900-FAFF:CJK 兼容象形文字 (CJK Compatibility Ideographs)
FB00-FB4F:字母表達形式 (Alphabetic Presentation Form)
FB50-FDFF:阿拉伯表達形式A (Arabic Presentation Form-A)
FE00-FE0F:变量选择符 (Variation Selector)
FE10-FE1F:竖排形式 (Vertical Forms)
FE20-FE2F:组合用半符号 (Combining Half Marks)
FE30-FE4F:CJK 兼容形式 (CJK Compatibility Forms)
FE50-FE6F:小型变体形式 (Small Form Variants)
FE70-FEFF:阿拉伯表達形式B (Arabic Presentation Form-B)
FF00-FFEF:半型及全型形式 (Halfwidth and Fullwidth Form)
FFF0-FFFF:特殊 (Specials)
如上、 红色加粗且跨度最大的一行便是表示中文字符的编码范围(其实也不仅仅是中文字符、好像还有其他的类似中文字符)。 其中有许多偏门的特殊编码会由于字符集而显示为乱码,这些字符应该大多数情况下不会用到的。
那么就可以在程序中直接使用【字符与16进制数比较大小】这种方式判断是否为中文
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中基本数据类型的固定长度是平台无关的)。
分享到:
相关推荐
本章内容是《Java语言程序设计教程(Java 7)——入门与提高篇02》的核心部分,主要围绕Java的基本编码能力培养。在编写有效、高质量的Java代码之前,了解如何表示信息、处理信息,以及如何利用选择结构、循环结构、...
字符编码是计算机中用于表示字符与数字之间关系的编码方式。常见的字符编码包括ASCII、ISO-8859-1、GB2312/GBK/GB18030、Unicode等。其中,Unicode旨在统一所有文字编码,并有几种实现方式,如UTF-8、UTF-16和UTF-32...
在Java编程语言中,处理字符串是一项常见的任务,尤其是在进行数据清洗、格式化或者解析文本时。中文和英文字符由于编码方式的不同,在处理时需要特别注意,尤其是当涉及到字符串的截取时。本文将深入探讨如何在Java...
Java 实现 GB2312 编码的原理与步骤 GB2312编码是中国国家标准,用于表示简体中文字符。它使用两个字节来表示...通过Java编程实现这一过程,有助于加深对这种编码方式的理解,并在实际项目中处理中文字符时提供参考。
`2Person`不合法是因为以数字开头,而`$12345`虽然在语法上是合法的,但在实际编码实践中很少使用这样的命名方式。 #### Java的基本数据类型与复合数据类型 - **基本数据类型**:包括整型(如`byte`、`short`、`...
Java使用**Unicode编码**来处理字符,这意味着每个字符在内存中占用16位,即2个字节。因此,一个`char`类型无法容纳一个中文字符,因为中文字符需要两个`char`来表示。 ### 4. Java语言特点 Java具有以下显著特点...
3. **java语言中不用区分字母的大写小写。(F)** - **解析**:这是错误的。Java是区分大小写的,比如类名、变量名等都需要正确区分大小写。 4. **数组允许存放不同类型的定长元素。(T)** - **解析**:这是...
- Java使用Unicode编码,这意味着每个字符占用2个字节,这使得Java能够很好地支持各种语言。 - Java中所有的整数类型都是带符号的,且每种类型的数据长度是固定的,这确保了代码的可移植性。 - Java中的整型常量...
4. **Java 语言中可用下标和指针两种方式表示数组元素** 错误。Java中使用下标来访问数组元素,而不支持使用指针直接操作内存中的数据。 5. **Java 语言的源程序不是编译型的,而是编译解释型的** 正确。Java源...
### Java基础面试题知识点解析 #### 一、面向对象的特征 面向对象编程(OOP)是Java编程的核心概念之一...Java使用UTF-16编码,一个`char`可以存储一个或多个Unicode码点,因此一个中文字符可以用一个`char`变量来表示。
- `char`类型可以存储一个中文汉字,因为Java中的`char`类型是16位的Unicode编码,足以表示一个汉字。 二、面向对象与高级特性解析 1. **`final`关键字的作用** - 使用`final`关键字修饰的变量,其引用不能改变...
- 在一个Java源文件中,可以定义多个类,但只能有一个公共类(public class),且该类的名字必须与文件名相同。 #### 4. 环境变量与目录 - `path`环境变量指向操作系统可以查找并执行可执行文件的目录,而`...
在Java编程语言中,标识符号、关键字和类型是构建程序的基础元素。理解并熟练掌握这些概念对于编写高质量的Java代码至关重要。以下是对这些主题的详细解释: **标识符号(Identifiers)** 在Java中,标识符是程序员...
8. Java的基本类型:8种,包括4种整型(byte、short、int、long)、2种浮点型(float、double)、1种布尔型(boolean)和1种字符型(char),字符使用Unicode编码。 9. 浮点常量默认类型:若无后缀f或d,浮点常量...
在Java中,方法参数的传递方式决定了是值传递还是引用传递。基本数据类型参数是值传递,而对象参数则是引用传递,传递的是对象引用的副本。 ### 重载与重写 - **重载(overload)**:指在同一个类中可以有多个同名...
42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...
- **Java区分大小写**:例如,`Hello`与`hello`被视为不同的标识符。 - **非法字符**:避免使用特殊字符,尤其是中文或其他非ASCII字符。 - **括号配对问题**:确保所有括号正确配对。 9. **path环境变量** - *...
Java中`char`类型采用Unicode编码,因此一个`char`变量可以存储一个中文汉字。 10. **抽象类和接口的异同**: - **抽象类**:可以包含抽象方法(没有实现的方法)和非抽象方法,以及成员变量。 - **接口**:只能...