UTF-8 转 Unicode
在编写FTP Client时,发现通过recv获取的数据是采用UTF-8方式进行编码的,直接用Unicode方式进行显示时会发生错误。采用MultiByteToWideChar也无法正确转换(default是Ascii to Unicode。是我的设置问题?没有仔细研究)。
因此学习了下UTF-8的编码原理,参考如下:
标准的UTF-8是有一个头(是EF BB BF)和Unicode有一个(FF FE头一样),每一个字可以由一个byte(如:英文字母、数字),也可以由二个byte(如:泛欧语系、斯拉夫语字母),也可以由三个byte组成(如:汉字)。一般由四个byte组成的字很少很少。UTF-8编码模板如下:
UCS-4 range (hex.) UTF-8 octet sequence (binary)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
从这个头之后的第一个byte,如果是0xxxxxxx形式,就说明这个字只有一个byte组成,如果是110xxxxx形式就说明这个字有二个byte组成,如果是1110xxxx形式就说明有三个byte组成,如果是11110xxx就说明有四个byte组成。
转换算法可以简单的理解为:
首先判断这个UTF-8有没有头(EF BB BF),没有从第一个byte开始处理,有头就跳三个byte,读到真正的内容。没有的话,第一个byte就是真正的内容。再把读到的第一个byte分析成(0000 0000---1111 1111)和UTF-8编码格式相比较,得出这个真正的字有几个位。如果是只有一个byte(格式为0xxxxxxx),直接就把这个字符以宽字符写进文件就行了。如果是二byte(格式为110xxxxx),我们就要算出xxxxx处的值,再读一个byte得到10xxxxxx也同样要算出xxxxxx,把这两个连在一起xxxxx和xxxxx组成一个二进制数,得到这个二进数的十进制值,再以宽字符写进文件就行了。如果是有三位(格式为1110xxxx),要再读两个byte得到10xxxxxx和10xxxxxx,把这xxxx 和xxxxxx和xxxxxx连在一起组成二进制数,把他再转成十进制,把这个值以宽字符写进文件。三个字节、四个字节的一次类推。
简单的转换code参考Unicode下char*(UTF-8)转CString(Unicode):
友情感谢:
http://www.magicwolf.cn/hobby/utf-8-to-unicode.html
http://blog.sina.com.cn/s/blog_4d25c9870100chmu.html