`
- 浏览:
3436 次
-
在java里一个字节是8位,char是两个字节即16位,相应的int是4个字节即32位。
一个UTF-8字符其实是UCS的实现形式,所以一般UTF-8只有三位,超过3位的则为一些象形文字之类。
首先需要明确的是计算机读取的所有东西均为字节,所以不管是什么字符最终均会转换成字节被读取。这样就引申出来一个问题:UTF-8这种多个字节的字符是怎么读取的?实际上这样的,计算机读取是顺序读取,也就是从左到右来顺序读取。于是聪明的设计者便用一种特殊的方式来实现UTF-8:
UTF-8一般有如下几种表现方式:
1个字节:0aaaaaaa
2个字节:110bbbbb 10aaaaaa
3个字节:1110cccc 10bbbbbb 10aaaaaa
因为计算机是顺序读取且读取的是字节,所以一个多位的字符,首先会被转成多个字节,接着计算机从高位字节往低位字节读取。
即如果一个字符是小于8位的,即是小于2<<7的,计算机读取到高位字节信息是以0开头时就不会进行额外运算,直接获取该字符,即其其实是一个ascii码字符。
接着是一个两个字节的字符,则计算机首先获取到的高位字节码是以110开头的,则计算机便知这是一个两个字节的字符,就会进行额外运算,将其与下一个字节进行联合运算,最终得到的字符其实是bbbbb aaaaaa.
同理一个三个字节的字符,最终得到的字符是cccc bbbbbb aaaaaa。
我们在自己实现对象持久化的时候,一般会将对象作为字节进行持久化。这时候便需要注意对char或者String(可以通过转成char保存,提供String的长度信息则可)进行保存时需要转码。
比如一个11011 100000的字符,其最终被保存成字节的时候则应该是11011011 1010000这样的两个字节。
则我们可以通过以下的算法来进行转码:
byte[] writeChars(char c) {
int code = c;
if (code <= 0x7F) {
return new byte[]{c};
} else if (code <= 0x07FF) {
return new byte[]{(byte)(0xC0 | ((code >> 6) & 0x1F)),(byte)(0x80 | code&0x3F)};
} else {
return new byte[]{(byte)(0xE0 | ((code >> 12) & 0X0F)),(byte)(0x80 | ((code >> 6) & 0x3F)),(byte)(0x80 | (code& 0x3F))};
}
}
这样就能保证字符持久化的正确性了。而读取的时候只要逆向运算就可以。
关于持久化的原理就留在后面再写了。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
4. **国际化和本地化**:如果你的程序需要支持多种语言,那么处理UTF-8就显得尤为重要,因为它能表示所有Unicode字符,包括非拉丁语系的字符。 5. **文件I/O**:当读写文件时,确保文件以UTF-8编码打开,这样可以...
UTF-8的优势在于对ASCII字符集的兼容性,前128个Unicode字符(包括英文、数字和常见符号)只需要一个字节表示,这使得UTF-8在互联网上广泛使用,因为其与ASCII的兼容性可以减少传输数据量。此外,UTF-8也支持全球大...
C# 生成 XML 文件,编码为 UTF-8 方法是指在 C# 编程语言中,使用特定的方法和类来生成 XML 文件,并将其编码为 UTF-8 编码格式的过程。这种方法常用于数据交换、配置文件、日志记录等领域。 在 C# 中,生成 XML ...
这些示例展示了汉字以及其他复杂字符如何通过特定的字节序列在UTF-8中被表示。每个编码前缀(如`E4`、`B8`、`80`)代表了特定的Unicode代码点的一部分,组合起来形成完整的字符编码。 #### 字符编码与码表的意义 ...
- **定义**:UTF-8是Unicode编码方案的一种实现,它使用可变长度的字节序列来编码每个字符。英文字符使用单个字节(8位)编码,而其他语言的字符可能使用2到4个字节编码。 - **优点**: - 兼容ASCII编码,使得...
然而,UTF-8有一个特殊特性,那就是它可以带有Byte Order Mark(BOM),这是一个特殊的字节序列,用于标识数据的编码方式。在某些情况下,BOM可能会引起问题,例如在读取文本文件时,可能会导致额外的乱码字符出现在...
- 国际化:在开发多语言应用时,使用UTF-8可以避免因编码问题引起的显示错误。 6. **注意事项**: - 转换过程中可能出现编码冲突,导致部分字符无法正确显示,此时需要人工干预或使用更高级的工具进行修复。 - ...
这个函数通过遍历UTF-8字节序列,对每个字符进行判断和转换。对于单字节字符,直接复制;对于双字节UTF-8字符,将其转换为GB2312编码的两个字节。请注意,GB2312只能表示一部分Unicode字符,对于超出范围的字符(如...
2. **扫描字节序列**:遍历文件内容,检查字节序列是否符合UTF-8编码规则。对于多字节字符,后续字节的最高位应为10,且每个字节的排列组合能对应到Unicode字符。 3. **一致性检查**:在整个文件中,确保所有的字节...
对于非ASCII字符,如中文、日文等,UTF-8会使用2至4个字节来表示,这使得它具有良好的跨平台和跨语言支持,尤其是在国际化的软件开发中。 GBK是GB2312的扩展,是中国大陆常用的汉字编码标准,它在GB2312的基础上...
GBK 和 UTF-8 是两种常见的字符编码格式,它们各自有其特点和应用场景。本篇文章将详细阐述这两种编码的区别、转换原理以及如何进行转换。 GBK(Great Chinese)编码是中国大陆广泛使用的多字节字符集,它是GB2312...
- 再通过`WideCharToMultiByte`函数将宽字符字符串转换为UTF-8编码的字符序列。 2. **UTF8ToMB** 该函数实现了从UTF-8编码转换回多字节编码的过程。其流程与上述过程相反: - 先使用`MultiByteToWideChar`将...
在C++中实现Unicode到UTF-8的转换,我们需要知道Unicode字符的码点,并根据码点值将其转换为相应的UTF-8字节序列。以下是一般步骤: 1. 首先,获取Unicode字符串。这通常涉及到读取宽字符数组或`wstring`对象。 2. ...
BOM是一个特殊的字节序列,用于标识文件的编码类型,对于UTF-8编码,BOM的字节序列为0xEF, 0xBB, 0xBF。 在Windows操作系统环境下,经常需要进行这样的转换,因为某些程序或系统可能更倾向于识别带有BOM的UTF-8编码...
2. **验证与修复**:库可以检查一个字符串是否是有效的UTF-8序列,如果发现不合法的序列,它还可以尝试自动修复。 3. **遍历与访问**:提供迭代器接口,使得开发者可以轻松地遍历UTF-8字符串中的每个字符,而无需...
UTF-8和Unicode的转换在跨平台开发、国际化和本地化中尤其重要。例如,如果你有一个使用UTF-8编码的软件,但在某些系统或环境中需要使用Unicode编码,那么`Utf8ToUnicode.exe`这样的工具就能派上用场。此外,某些...
- 兼容性:UTF-8更具有国际化,GBK主要在中国使用。 4. **GBK与UTF-8的转换** - 在C语言中,我们可以编写函数来实现GBK和UTF-8之间的转换。文件`utf8gbk.h`和`utf8gbk.c`可能包含了这样的转换函数。 - 通常,从...
例如,程序`nihao.c`包含字符串"你好\n",在内存和磁盘中,这些汉字会被编码为UTF-8字节序列,如`e4 bd a0 e5 a5 bd 0a 00`。在编译过程中,C编译器不会改变这些字节序列,而是将它们直接复制到目标文件中。当程序...
这展示了文件如何存储和展示汉字,每个汉字由其对应的UTF-8编码表示。 #### 应用场景 1. **验证码生成**:在网站登录、表单提交等环节,使用随机生成的常用汉字作为验证码,可以有效防止自动化攻击,提升系统安全...
2. **成员函数**:可能包含查找、替换、截断、比较等操作,这些函数需要考虑UTF-8编码的特性,避免破坏字符序列。 3. **转换功能**:从UTF-8转换到其他编码,如UCS-2或UTF-16,反之亦然,这对于与不同系统的交互至关...