`
gelongmei
  • 浏览: 209905 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

char类型与Unicode编码

 
阅读更多
char类型与Unicode编码
Unicode(UTF-8, UTF-16)令人混淆的概念

Java的char型是非常独特的,占用两个字节,因为Java中char型采用了Unicode编码。

要理解这个问题,我们必须要理解什么是Unicode。

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。

Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。与ASC2和ISO-8859-1类似,Unicode是一种编码方式,但是它所包括字符的范围却与之前的所有编码方式有着天壤之别。Unicode是一个囊括了几乎世界上所有文字的字符编码表。它的目标是任何文字都可以在其中找到唯一的编码,例如0041表示了字符A,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。它所要解决的主要问题是:不同语言和地区之间字符编码转换的问题,如果
采用了Unicode编码的话则不需要在不同的字符集之间切换,因为都包括在Unicode当中。
Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同,具体由UTF(UCS Transformation Format)规范规定,常见的UTF规范包括UTF-8、UTF-16、UTF-32。

Java语言中char类型采用UTF-16编码格式。
从JDK1.5开始,代码点(code point)是指与一个编码表中某个字符对应的代码值。在Unicode标准中,代码点采用16进制数写,并加上前缀U+,例如U+0041就是字母A的代码点。Unicode代码点可以分成17个代码级别(code plane)。第一个代码级别称为基本的多语言级别(basic multilingual plane),代码点从U+0000到U+FFFF,其中包括了经典的Uncode代码;其余16个附加级别,代码点从U+10000带U+10FFFF,其中包括了一些辅助字符(supplementary character)。
UTF-16它采用不同长度的编码表示所有的Unicode代码点(是一种变长的编码方式)。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元惊醒编码。这样构成的代码值一定落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域(surrogate area)(U+D800到U+DBFF用于第一个代码单元,U+DC00到U+DFFF用于第二个代码单元)。这种设计十分巧妙,我们可以从中迅速的知道一个代码单元是一个字符编码,还是一个辅助字符的第一或第二部分。
强烈建议不要再程序中使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。可以采用转义序列符/u表示Unicode代码单元。(为什么呢?)

写了段代码,从中可以可以基本理解Java的char、Unicode、代码点和代码单元的概念了,详见 Java中的基础类型,用二进制表示数字
分享到:
评论

相关推荐

    (UNICODE 与非UNICODE导致的问题)CString,TCHAR和CHAR类型的互转.docx

    在C++编程中,特别是在MFC(Microsoft Foundation Classes)库中,`CString`、`TCHAR`和`CHAR`类型扮演着关键的角色,它们之间的转换是解决UNICODE和非UNICODE兼容问题的关键。 `CString`是MFC库提供的一种字符串类...

    字符转化为UNICODE码

    Unicode码,全称为统一码或万国码,是一种在计算机科学领域广泛使用的字符编码标准,旨在为世界上所有的字符提供一个唯一的、统一的数字表示。Unicode的出现解决了早期各种字符编码系统(如ASCII、GB2312等)无法...

    C实现数字转Unicode码

    总的来说,C语言实现数字到Unicode码的转换涉及对Unicode编码的理解、选择合适的编码方案以及可能需要的字节顺序处理。在处理Unicode时,应确保充分理解其工作原理,以便编写出正确且高效的应用程序。

    Unicode码生成器

    Unicode码生成器是一种工具,主要用于将输入的字符或字符串转换成其对应的Unicode编码。Unicode是一种国际标准,旨在统一世界上所有语言的文字表示,包括字母、数字、标点符号等。它使用一个唯一的数字来代表每一个...

    C++类型转换(char* string cstring unicode ansi )转换

    C++类型转换(char* string cstring unicode ansi 等等)转换 C++类型转换是指在C++编程语言中,各种类型之间的转换操作。这种转换操作包括基本类型之间的转换、字符串类型之间的转换、字符类型之间的转换等等。在...

    VB6.0 Unicode码 汉字 互转,支持混合互转.zip

    本文将详细讨论如何在VB6.0中实现Unicode码与汉字的互转,以及如何处理混合编码的转换。 首先,我们需要理解Unicode的基本概念。Unicode是一个国际标准,为每个字符分配一个唯一的数字,不论这个字符属于哪种语言。...

    C++11 Unicode编码转换

    在C++11标准中,Unicode编码转换是一个重要的更新,主要涉及了新的数据类型和字符串定义方式,以解决跨平台的Unicode字符处理问题。这里详细解释一下这些知识点: 1. **char16_t 和 char32_t 类型**: 在C++98之前...

    十进制与unicode互转

    在Java中,`char`类型用于表示单个字符,它的范围是从U+0000到U+FFFF,涵盖了基本多文种平面(BMP)的Unicode码点。对于超出这个范围的码点,Java使用代理对(surrogate pairs)来表示,这是两个`char`值的组合,...

    使用javascript将汉字转化成UNICODE编码

    在JavaScript中,...总结,通过JavaScript,我们可以方便地实现汉字与Unicode编码之间的转换,这在处理多语言文本和特殊字符时尤其重要。了解并熟练运用这些技巧,对于提升JavaScript编程的效率和灵活性大有裨益。

    常用的java汉字unicode编码

    在给定的文件中,虽然部分内容难以直接解析为明确的IT知识,但通过其标题“常用的java汉字unicode编码”以及描述“该文档有常用的java汉字unicode编码”,我们可以深入探讨与之相关的知识点。 ### Unicode编码的...

    java 中文Unicode转换

    在Java中,Unicode编码主要通过字符串对象的`char`类型来实现。每个`char`变量可以存储一个Unicode码点,但需要注意的是,对于超出BMP范围的字符,Java使用代理对(Surrogate Pair)来存储。一个代理对由两个`char`...

    JavaScript字符的unicode编码

    // unicode: 返回一个字符的...// 码值与ascii码相同。因此本函数也可以用作不严格地判断一个字 // 符是半角还是全角。当返回值小于256时,char为半角字符,否则 // char为全角字符。 // sylens@smth, 2004/12/06

    汉字跟Unicode 互相 转化 C# 代码

    Unicode编码方案中,每个汉字都有一个固定的码点(Code Point),这使得不同地区的字符能够统一表示,避免了编码冲突问题。C#中的字符串类型`string`默认采用UTF-16编码,这是Unicode的一个实现,它可以表示所有的...

    char类型介绍.zip

    对于Unicode字符集,`char`类型也可以扩展到更大的范围,但具体取决于编译器和平台的实现。`char`类型在编程中有着广泛的应用,例如,它可以用来处理字符串、读写文本文件、进行字符操作等。 描述中提到的博客链接...

    char和Asc码(转换函数)

    在Java和C#中,`char`可以表示一个Unicode码点,但在C++中,`char`通常只能表示ASCII,处理Unicode可能需要使用`wchar_t`或`std::u16string`等宽字符类型。 3. **转换函数** - 在编程中,有各种函数用于在字符和...

    Unicode下CString与char*之间的转换(vs2008绝对实用)

    本文主要介绍在Unicode环境下,如何在CString与char*之间进行转换。 首先,我们来看Unicode下的CString转换为char*的方法: 1. 使用API `WideCharToMultiByte` 进行转换: ```cpp CString str = _T("D://校内...

    CString-to-char(Unicode).rar_CString_cstring char*_cstring to ch

    在描述中提到的“Unicode下CString与char_转换”,意味着我们要讨论在Unicode环境下,如何将`CString`对象转换成`char*`数组,这通常涉及到字符编码的转换。`CString`对象可以方便地存储Unicode字符串,但当我们需要...

    C语言GBK、Unicode与UTF8互转代码,含转码表及接口函数

    - `int unicode_to_utf8(const wchar_t* unicode_buffer, int unicode_len, char* utf8_buffer, int utf8_len)`:将宽字符(Unicode)转换为UTF-8编码。 在实际应用中,转码表通常是预先计算好的,可以以数组的形式...

    java基本数据类型和数组,java编制0-255之间的UNICODE编码表

    #### 编制0-255之间的Unicode编码表 这个任务要求使用循环遍历0到255之间的每一个整数,并将这些整数转换为对应的Unicode字符。这可以通过使用`char`类型实现: ```java for (int i = 0; i ; i++) { System.out....

    通过对字符的unicode编码进行判断来确定字符是否为中文

    - 使用`Char.ConvertToUtf32`方法获取指定索引位置的字符的Unicode编码。 5. **字符判断**: - 通过比较字符的Unicode编码值是否位于定义的中文字符范围内来判断该字符是否为中文字符。 #### 使用场景 这种方法...

Global site tag (gtag.js) - Google Analytics