UTF-8转Unicode

首先,UTF-8和Unicode是有转换关系的,我们假设UTF-8字符串没有BOM。

 wstring UTF8toUnicode(const string &input){int state = 0;unsigned char temp;wchar_t wc;wstring wstr;for (unsigned char c : input){switch (state){case 0:if (c >> 4 == 14)// 1110{temp = c << 4;state = 1;break;}if (c >> 5 == 6)// 110{temp = c >> 3 & 7;// 7dec=111bwc = temp << 8;temp = c << 6;state = 3;break;}if (c >> 7 == 0) // 0{wstr += c;state = 0;break;}throw string("Decode UTF-8 error.");break;case 1: // 1110 xxxxif (c >> 6 == 2) //10{temp |= c >> 2 & 0xf;wc = temp << 8;temp = c << 6;state = 2;}elsethrow string("Decode UTF-8 error.");break;case 2: // 1110 xxxx 10xx xxxxif (c >> 6 == 2) //10{temp |= c & 0x3F;wc |= temp;wstr += wc;state = 0;}elsethrow string("Decode UTF-8 error.");break;case 3: // 110x xxxxif (c >> 6 == 2) //10{temp |= (c & 0x3F);wc |= temp;wstr += wc;state = 0;}elsethrow string("Decode UTF-8 error.");break;}}return wstr;}

函数返回wstring格式的Unicode字符串。如果编码不正确会抛出异常。

Unicode转GB2312

有些人提供的方法还要自己准备编码表,实在麻烦。Windows本就已经提供了API的。

 string Unicode2GBK(const wstring &input){int nLen = (int)input.length();DWORD num = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)input.c_str(), -1, NULL, 0, NULL, 0);string str(num, ' ');int nResult = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)input.c_str(), nLen, (LPSTR)str.c_str(), num, NULL, NULL);return str;}

关于UTF-8的BOM

UTF-8字符串有时会在前面附上BOM,但有时既没有提供编码方式也没有BOM,这时可以采用试解码的方式解决。直接调用UTF8toUnicode函数,若抛出异常则说明不是UTF-8编码,若没有异常则说明解码正确。
笔者采用此方法在解码eml文件时效果良好。

C++中UTF-8, Unicode, GB2312转换及有无BOM相关问题相关推荐

  1. vc中GB2312,BIG5,Unicode编码转换

    本文主要讨论的是VC编译环境下,实现字符串和文件编码方式转换的实现,linux下请使用Strconv. 一.文件编码格式转换 //GB2312 编码文件转换成 Unicode: if((file_ha ...

  2. C++中Ansi、Unicode、UTF8字符串之间的转换和写入

    转自: http://dark0729.blogbus.com/logs/51496111.html Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件 Un ...

  3. 关于Laravel中使用response()方法调用json()返回数据unicode编码转换的问题解决

    关于Laravel中使用response()方法调用json()返回数据unicode编码转换的问题解决 参考文章: (1)关于Laravel中使用response()方法调用json()返回数据un ...

  4. 字符集之间转换(UTF-8,UNICODE,Gb2312) c++

    UTF-8:   3字节一个字符 UNICODE: 2字节一个字符 GB2312:  1字节一个字符 例子: "你"字的UTF-8编码: E4 BD A0 11100100 101 ...

  5. c++字符集之间转换(UTF-8,UNICODE,Gb2312)

    2019独角兽企业重金招聘Python工程师标准>>> UTF-8:   3字节一个字符 UNICODE: 2字节一个字符 GB2312:  1字节一个字符 例子: "你& ...

  6. JavaScript中字符串与Unicode编码的互相转换

    JavaScript中字符串与Unicode编码的互相转换 这段代码演示了JavaScript中字符串与Unicode编码的转换: // 为了控制台的演示方便, 变量没有添加 var 定义 // 实际 ...

  7. linux unicode 转换工具,字符集之间转换(UTF-8,UNICODE,Gb2312)

    特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换. UTF-8:   3字节一个字符 UNICODE: 2字节一个字符 GB2312:  1字节一个字符 例子: "你& ...

  8. UTF、Unicode、ASCII及中文编码

    一.Unicode缘起 Unicode是一种字符编码规范 . 1.国际标准ASCII编码 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits)  ...

  9. Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码与转码问题

    代码如下:如果不不设全局的字符集是utf-8,那么网上一般的方法是可以转的.如下程序中 #define DD 1的情况下:但是如果设置了全局的utf-8,再用以前的方法: QByteArray ba= ...

最新文章

  1. [Google API](5)筛选结果
  2. 网页编辑html中怎么写搜索代码,如何在html页面中实现查找功能
  3. xml python2.6_如何使用前缀选项解析python 2.6中的参数为-f file.xml
  4. CSP认证 201312-4有趣的数[C++题解]:组合数、数学
  5. 隐藏SSID无线网络ID 你的无线网络真的安全吗?
  6. Windows Server 2012 在个人终端上使用的推荐设置
  7. 武汉工程大学计算机学院研究生难吗,武汉工程大学考研难吗?一般要什么水平才可以进入?...
  8. 怎么用计算机打出来自天堂的恶魔呢,来自天堂的恶魔
  9. 运维的核心竞争力是什么
  10. 图解TCPIP---第一章
  11. 二/三维空间曲面的切平面以及在某一点上的切线,法线
  12. 友善之臂 NANO T3 运行裸机程序
  13. JNDI-Injection-With-LDAP-Unserialize
  14. 使用 font-spider 对 webfont 网页字体进行压缩
  15. Android 发送彩信
  16. ARM发布 Cortex-M35P保护物联网智能连接
  17. SQL--多的是,你不知道的事
  18. Springboot2.x集成ecache3.8.1使用@Cacheable缓存(代码方式,无xml)
  19. phpbreak跳出几层循环_PHP break:跳出循环
  20. 华为HCNP h12-221习题训练加解析(1-13)

热门文章

  1. Jim Zemlin:中国是开源最重要的市场
  2. linux下 kafka的安装
  3. 微信小程序游戏开发介绍,微信互动游戏有哪些?
  4. Polar码(1)— 基础理论
  5. 关于以太网IO模块如何选型
  6. 微信公众号怎么添加附件?
  7. 计算机视觉算法实习生:大厂面试经历(百度、京东、滴滴、字节、美团,旷视,快手,小米)
  8. unity 射线检测 碰撞点不准确的原因分析
  9. [水]关于web地图
  10. 靶机实战(bulldog)