UTF-8 转 Unicode

本文介绍了在FTP客户端开发中遇到的UTF-8到Unicode转换问题,详细讲解了UTF-8编码原理和转换算法,并提供了C++实现的转换代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值