看到题目就知道是涉及到Uncode的,Unicode的编码方式有UTF-32,UTF-16,UTF-8三种,这里为什么单单只讲UTF-16呢?无它,UTF-16这位老兄故事多啊~
在Unicode诞生之前,世界上许多字符集并存而且互不兼容,这导致很多软件在国际化过程中困难重重,随着互联网的普及和国际间交流的增多,问题就愈发严峻了。Unicode正是在这样的大环境下成长起来的。我们可以认为,Unicode的出现,就像秦始皇统一六国,在字符集中实现了统一的“度量衡”,在各个领域中发挥着重要的作用。
从90年代初开始,Unicode一直不断地发展和完善。在Unicode的最初版本中,Unicode是被设计成定长的,长度为16 bits,2 Bytes。这在形式上跟ASCII和ISO8859-1等编码方式是十分相似的,只不过长度更长,编码空间(code space)更大。当时人们认为,2个字节形成的编码空间,也就是65535个code point (code point就是编码空间中的一个值,用以唯一标识一个字符)已经能包括世界上所有出现过和将要出现的字符了。于是乎,在Unicode的编码问题上,一个最直接的办法就是每个字符使用两个字节进行存储,这样code point跟编码间有着简单的一一对应关系(两者都是16位)。从这里开始,UTF-16登上了历史的舞台,但是现在的UTF-16是经过修正的,我们把最初未作修改的编码方式称作UCS2。但是,就象当年我们认为两个数字足够表示所在年份一样,Unicode的“65535问题”就像“千年虫问题”一样如期而至,我们慢慢发现,大千世界中出现的字符并不是简单的65535所能囊括的。历史再一次证明,我们应该用发展的眼光看待问题的产生和发展,任何静止的观点最终都会被历史所淘汰。(呵呵,政治没学好,凑合吧)
到了今天,Unicode已经是第五版了,它的编码空间是0x000000到0x10FFFF,共有1,114,112个。显然,此时直接使用最初的UTF-16编码方式是不合适的,因为code point 值大于0xFFFF的Unicode将无法编码。怎么办呢?说到这里,首先要明白一点,在Unicode中,并不是所有的code point都是分配给字符的,譬如在BMP(Base Multilingual Plane,也就是最初版本的2个字节组成的code space)中,就分为General Scripts Area,Symbols Area,CJK Miscellaneous Area,CJKV ideographs,Asian Scripts Area,Surrogates Area, Private use Area, Compatibility and Special Area等8个不同的区域,其中后面三个区域的code point都是没有分配给特定字符的(具体的介绍可以参看 Unicode Standard version 4.0 section 2.8)。好了,既然原来的字符空间装不下新增的字符,我们只好从其他区域借点地方过来了。于是,我们从原来的Private Use Area中把U+D800 - U+DFFF划分出来,专门用于UTF-16编码,这就是现在的Surrogates Area。有了Surrogates Area以后,UTF-16就有足够的空间来进行编码了:
1、对于code point 小于 0xFFFF的字符,我们可以直接一一对应进行编码,这跟原来是一致的。
2、对于code point 为 0x01000-10FFFF之间的字符使用两个字节表示,高字节的取值范围是U+D800-
U+DBFF,低字节的取值范围为U+DC00-U+DFFF。
那么,一个code point 是如何编码成两个符合规定的字节呢?具体算法如下:假定c的code point大于0xFFFF,则
high-byte = (0xD7C0 + (c >> 10));
low-byte = (0xDC00 | c & 0x3FF);
下面是一些编码结果:
\uD800\uDC00 = U-00010000
\uD800\uDC01 = U-00010001
\uD801\uDC01 = U-00010401
\uDBFF\uDFFF = U-0010FFFF
可以参看一下 Unicode Transformation Formats: UTF-8 & Co.
分享到:
相关推荐
std::string utf16_to_utf8(const std::wstring& utf16_str) { std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; return converter.to_bytes(utf16_str); } ``` 在进行转换时,需要注意的错误...
### UTF-16汉字编码表知识点解析 #### 一、UTF-16简介 UTF-16(Unicode Transformation Format-16bit)是一种用于表示Unicode字符集的编码方式。它通过16位或32位来存储每一个字符,主要用于解决ASCII、GBK等传统...
最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。
例如,可能有`UTF8toUTF16()`、`UTF16toUTF8()`、`UTF32toUTF16()`以及`UTF16toUTF32()`等函数,它们负责将一个编码的字符串转换为另一种编码。 5. **转换原理** 转换过程中,关键在于理解每个编码的结构和规则。...
在讨论UTF-16编码规范之前,需要了解几个关键概念。首先,ISO 10646是一个国际标准,它定义了一个极为广泛的字符集,覆盖了世界上的大多数写作系统。Unicode标准与ISO 10646是密切关联的,共同定义了这个被称为...
在 UTF-16 编码方式中,“汉字”对应的数字是 0x6c49 和 0x5b57,而编码的程序数据是:WORD data_utf16[] = {0x6c49, 0x5b57}; 在 UTF-32 编码方式中,“汉字”对应的数字是 0x00006c49 和 0x00005b57,而编码的...
功能:读出d:\before.txt文件(utf-16格式),按文件中的每个字的utf-16的大小进行由小到大的排序,并去掉重复的字,结果保存在d:\test_result.txt中,源文件少于200字。 使用方法:双击sort.bat出现成功字样!则...
#### 描述:“字符编码文件,UTF16BE编码,和GBK_FIXED.txt文件的字符一一对应” 这段描述告诉我们以下几点关键信息: 1. **文件类型**:这是一份**字符编码文件**,意味着它存储了字符及其对应的编码。 2. **编码...
包含GBK和UTF16字符集的对照表,用于将GBK字节流和UTF字符串之间的互相转换。
UTF-16BE,全称为Unicode Transformation Format - 16 Bit Big Endian,是一种Unicode字符集的编码方式,主要用于处理大量的Unicode字符。在UTF-16BE编码中,每个Unicode字符通常由两个或四个字节表示,其中"Big ...
ChangeEncoding change file encoding in batches, now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java java -Dfile.encoding=utf-8 -mx1000m -jar ChangeEncoding-...1.1 添加新的编码UTF16LE(UTF-16LE)、UTF16BE(UTF-16
CodeDetectorDetect File encoding, Now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java检查文件编码,主要针对中文文本。目前支持 UTF-8(BOM或无BOM)、GBK、UTF-16LE、UTF-16BE单个文件或文件夹,支持编码批量转换。...
首先,需要了解UTF-8和UTF-16LE这两种编码格式。UTF-8是一种变长编码格式,使用1到4个字节来表示一个字符。UTF-16LE是一种定长编码格式,每个字符使用2个字节来表示。Excel 2007以上版本可以识别UTF-16LE编码格式的...
标题中的“pb12 gb转utf-8”指的是在编程领域中进行的一种字符编码转换操作。PB12可能是指PowerBuilder 12,一个流行的Windows应用程序开发工具,而GB和UTF-8则涉及到字符编码标准。 GB(通常指的是GBK或GB2312)是...
Qt打开文本时自动检测文件编码并正确解析文件,通过检测文件头... UTF16LE, UTF16BE, UTF8, UTF8BOM, }; class Skysonya : public QObject { Q_OBJECT Q_ENUM(EncodingFormat) public: explicit Skysonya(QObj
以UTF=16LE编码方式保存或读取文件,可以结合博客“c++ 以UTF-16LE编码方式保存文件”查看辅助理解
BOM的主要作用是在数据传输或存储时标识文件或数据流的字符编码,尤其是区分大端序(Big-Endian)和小端序(Little-Endian)的UTF-16编码。 在Java中,当我们从UTF-8编码的文本文件读取内容时,如果文件开头带有BOM...
有61726个字符,csv格式,做编码的基础数据 0000, 0001,Ā 0002,Ȁ 0003,̀ 0004,Ѐ 0005,Ԁ 0006, 0007,܀ 0008,ࠀ 0009,ऀ 000C,ఀ 000D,ഀ 000F,ༀ 0010,က 0011,ᄀ 0012,ሀ
- **转换**:UTF-8、UTF-16等都是Unicode的具体实现方式,不同的实现方式可以根据需要选择。 #### 五、GBK 和 GB2312 - **定义**: - **GBK**:是对GB2312标准的扩展,包含了更多的字符,尤其是对简体中文的支持...
- 把每个Unicode码点转换为UTF-16格式,因为Unicode通常以UTF-16形式存储。 2. Unicode转UTF-8: - Unicode码点转换为UTF-8的过程相对复杂,因为UTF-8编码是变长的,根据Unicode码点的大小,可能会占用1到4个字节...