Unicode是Unicode.org制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持。Unicode.org官方对Unicode的定义是:Unicode provides a unique number for every character。可见,Unicode所做的是为每个字符定义了一个相应的数字表示。比如,“a“的Unicode值是0x0061,“一”的Unicde值是0x4E00,这是最简单的情况,每个字符用2个字节表示。
Unicode.org定义了百万个以上的字符,如果将所有的字符用统一的格式表示,需要的是4个字节。“a“的Unicode表示就会变成0x00000061,而“一“的Unicode值是0x00004E00。实际上,这就是UTF32,Linux操作系统上所使用的Unicode方案。
但是,仔细分析可以发现,其实绝大部分字符只使用2个字节就可以表示了。英文的Unicode范围是0x0000-0x007F,中文的Unicode范围是0x4E00-0x9F**,真正需要扩展到4个字节来表示的字符少之又少,所以有些系统直接使用2个字节来表示Unicode。比如Windows系统上,Unicode就是两个字节的。对于那些需要4个字节才能表示的字符,使用一种代理的手法来扩展(其实就是在低两个字节上做一个标记,表示这是一个代理,需要连接上随后的两个字节,才能组成一个字符)。这样的好处是大量的节约了存取空间,也提高了处理的速度。这种Unicode表示方法就是UTF16。一般在Windows平台上,提到Unicode,那就是指UTF16了。
至于UTF16-LE和UTF16-BE,与计算机的CPU构架有关。LE指Little Endian,而BE指Big Endian。关于这方面的信息,网上有很多相关的帖子。我们一般的X86系统都是Little Endian的,可以认为UTF16=UTF16-LE.
由于对于欧洲和北美,实际上使用的编码范围在0x0000-0x00FF之间,只需要一个字符就可以表示所有的字符。即使是使用UTF16来作为内存的存取方式,还是会带来巨大的空间浪费,因此就有了UTF8的编码方式。这是一种很灵活的编码,对于只需要1个字节的字符,就使用一个字节,对于中日韩等原本需要两个字节才能表示的字符,则通过一个UTF16-UTF8的算法实现相互之间的转换(一般需要3个字节才能表示),而对于需要4个字节才能表示的字符,UTF8可以扩展到6个字节每个字符。UTF8使用的算法很有意思,大致映射关系如下:
UTF-32 UTF8
0x00000000 - 0x0000007F 0xxxxxxx
0x00000080 - 0x000007FF 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 - 0x7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
可以发现这和IP的分址算法很是相像。
由于UTF8可以方便的转换为UTF16和UTF32(不需要码表,转换算法可以在Unicode.org上找到C代码)。而且UTF8在每个操作系统平台上的实现都是一样的,也不存在跨平台的问题,所以UTF8成为跨平台的Unicode很好的解决方案。当然,对于中文来说,由于每个字符需要3个字节才能表示,还是有点浪费的。
【转载地址】http://blog.csdn.net/dengyunze/article/details/160958
【参考地址】http://vivizhyy.iteye.com/blog/1535760
分享到:
相关推荐
最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。
UTF-16BE UTF16LE UTF-16LE UTF32 UTF-32 UTF32BE UTF-32BE UTF32LE UTF-32LE UCS2 UCS-2 UCS-2LE UCS-2BE UCS-2-INTERNAL UCS4 UCS-4 UCS-4LE UCS-4BE UCS-4-INTERNAL SDL_iconv.c是一部分。 ...
CodeDetectorDetect File encoding, Now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java检查文件编码,主要针对中文文本。目前支持 UTF-8(BOM或无BOM)、GBK、UTF-16LE、UTF-16BE单个文件或文件夹,支持编码批量转换。...
读取ANSI 明码文件 读取Unicode 明码文件 读取Unicode big endian 明码文件 读取UTF-8 明码文件 读取UTF8 Bom 明码文件 读取UTF16-LE 明码文件 读取UTF16-BE 明码文件 到多字节字符串 扩展类CFilePlainCode
例如,txt文件由UTF-16LE转为UTF-8…… 问题重现:往往利用python处理数据时,都会遇到文件编码格式不对,那么如何批量转换呢,下面直接上代码! 实例:整个文件夹的txt文件由UTF-16LE转为UTF-8 # coding utf-8 ...
change file encoding in batches, now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java java -Dfile.encoding=utf-8 -mx1000m -jar ChangeEncoding-1.0.jar inputPath outPath in_encoding out_encoding in_encoding 是...
基于C写的 UTF8-无BOM转为UTF16LE UTF8-无BOM转为UTF8 UTF8转为UTF8-无BOM
以UTF=16LE编码方式保存或读取文件,可以结合博客“c++ 以UTF-16LE编码方式保存文件”查看辅助理解
pb12 gb转utf-8
一个LRC(标准歌词)、TRC(天天动听歌词)、KRC(酷狗音乐歌词)之间相互转换的工具,自动识别ANSI、UTF-8-BOM、UTF-8-NOBOM、UTF-16LE-BOM、UTF16BE-BOM编码,同时可保存为ANSI、UTF-8-BOM、UTF-8-NOBOM、UTF-16LE...
主要介绍了Java避免UTF-8的csv文件打开中文出现乱码的方法,结合实例形式分析了java操作csv文件时使用utf-16le编码与utf8编码相关操作技巧,需要的朋友可以参考下
处理UTF-8,UTF-16BE,UTF-16LE; (可选)将DOS或Windows代码页或HP-Roman8中的常用字符转换为ISO-8859-1。 UCS字符可以映射到8位转换字符串。 单个ISO C源文件“ 8conv.c”。 可以通过配置文件控制翻译,示例文件...
功能介绍 在文本字元编码之间进行转换(包括UTF-8,没有bom标记的UTF-8,UTF-16le,UTF-16be,UTF-32le,UTF-32be,中文简体GBK,中文繁体BIG5,日文 shift-JIS, 日文 euc-jp, 韩文 euc-kr等, 请参照支援的
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
文件编码批量转换工具可以将GBK、UTF-8、US-ASCII、ISO-8859-1、GB2312、UTF-16、UTF-16BE、UTF-16LE等编码格式的文件互相转换成你需要的文件。
"UTF-16LE" "UTF-32" "UTF-32BE" "UTF-32LE" "Windows-1250" "Windows-1251" "Windows-1252" "Windows-1253" "Windows-1254" "Windows-1255" "Windows-1256" "Windows-1257" "Windows-1258"。
UTF-16BE UTF-16LE UTF-32BE UTF-32LE windows-1250 windows-1251 windows-1252 windows-1253 windows-1255 x-euc-tw X-ISO-10646-UCS-4-2143 X-ISO-10646-UCS-4-3412 x-mac-cyrillic ## Licensing ...
总是遇到文件编码不一致的情况,自己抽...支持gb2312、gbk(ansi)、gb18030、utf-8、utf-8bom、utf-16le、utf-16be 自动识别文本文件后缀名、原始编码格式,根据用户设定的目标编码智能转换 其他详细说明见软件内说明。
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装