对于开发物联网或者跟网络相关的人员来说应对不同的编码转换尤其麻烦,如果所用的库有当然最好,对于单片机开发或者一些其他开发来说,库就相对少点或者不好找,所以就总结了一份来方便使用。

最近搞了一段时间联网的产品,因为需要连接服务器,而自己的系统用的编码是GBK的,所以数据编码方式会有所差异,需要我们自行转化编码来让系统可以理解传的数据的含义(包括自己)。

在网上找了很久相关的资料,GBk与Unicode,utf8之间是没有明确的转换公式,主流还是使用查表法来索引对应的编码。Unicode与utf8之间就存在对应的转换(工程使用vs搭建的,代码用C语言)

/*****************************************************************************
* 将一个字符的Unicode(UCS-2和UCS-4)编码转换成UTF-8编码.
*
* 参数:
*    unic     字符的Unicode编码值
*    pOutput  指向输出的用于存储UTF8编码值的缓冲区的指针
*    outsize  pOutput缓冲的大小
*
* 返回值:
*    返回转换后的字符的UTF8编码所占的字节数, 如果出错则返回 0 .
*
* 注意:
*     1. UTF8没有字节序问题, 但是Unicode有字节序要求;
*        字节序分为大端(Big Endian)和小端(Little Endian)两种;
*        在Intel处理器中采用小端法表示, 在此采用小端法表示. (低地址存低位)
*     2. 请保证 pOutput 缓冲区有最少有 6 字节的空间大小!
****************************************************************************/
int enc_unicode_to_utf8_one(unsigned long unic, unsigned char *pOutput,int outSize)
{//assert(pOutput != NULL);  //assert(outSize >= 6);  if (pOutput == NULL || outSize<6) return 0;if (unic <= 0x0000007F){// * U-00000000 - U-0000007F:  0xxxxxxx  *pOutput = (unic & 0x7F);return 1;}else if (unic >= 0x00000080 && unic <= 0x000007FF){// * U-00000080 - U-000007FF:  110xxxxx 10xxxxxx  *(pOutput + 1) = (unic & 0x3F) | 0x80;*pOutput = ((unic >> 6) & 0x1F) | 0xC0;return 2;}else if (unic >= 0x00000800 && unic <= 0x0000FFFF){// * U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx  *(pOutput + 2) = (unic & 0x3F) | 0x80;*(pOutput + 1) = ((unic >> 6) & 0x3F) | 0x80;*pOutput = ((unic >> 12) & 0x0F) | 0xE0;return 3;}else if (unic >= 0x00010000 && unic <= 0x001FFFFF){// * U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  *(pOutput + 3) = (unic & 0x3F) | 0x80;*(pOutput + 2) = ((unic >> 6) & 0x3F) | 0x80;*(pOutput + 1) = ((unic >> 12) & 0x3F) | 0x80;*pOutput = ((unic >> 18) & 0x07) | 0xF0;return 4;}else if (unic >= 0x00200000 && unic <= 0x03FFFFFF){// * U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  *(pOutput + 4) = (unic & 0x3F) | 0x80;*(pOutput + 3) = ((unic >> 6) & 0x3F) | 0x80;*(pOutput + 2) = ((unic >> 12) & 0x3F) | 0x80;*(pOutput + 1) = ((unic >> 18) & 0x3F) | 0x80;*pOutput = ((unic >> 24) & 0x03) | 0xF8;return 5;}else if (unic >= 0x04000000 && unic <= 0x7FFFFFFF){// * U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  *(pOutput + 5) = (unic & 0x3F) | 0x80;*(pOutput + 4) = ((unic >> 6) & 0x3F) | 0x80;*(pOutput + 3) = ((unic >> 12) & 0x3F) | 0x80;*(pOutput + 2) = ((unic >> 18) & 0x3F) | 0x80;*(pOutput + 1) = ((unic >> 24) & 0x3F) | 0x80;*pOutput = ((unic >> 30) & 0x01) | 0xFC;return 6;}return 0;
}
/*****************************************************************************
* 将一个字符的UTF8编码转换成Unicode(UCS-2和UCS-4)编码.
*
* 参数:
*    pInput      指向输入缓冲区, 以UTF-8编码
*    Unic        指向输出缓冲区, 其保存的数据即是Unicode编码值,
*                类型为unsigned long .
*
* 返回值:
*    成功则返回该字符的UTF8编码所占用的字节数; 失败则返回0.
*
* 注意:
*     1. UTF8没有字节序问题, 但是Unicode有字节序要求;
*        字节序分为大端(Big Endian)和小端(Little Endian)两种;
*        在Intel处理器中采用小端法表示, 在此采用小端法表示. (低地址存低位)
****************************************************************************/
int enc_utf8_to_unicode_one(const unsigned char* pInput, unsigned long *Unic)
{extern int enc_get_utf8_size(const unsigned char pInput);//assert(pInput != NULL && Unic != NULL);  if (pInput == NULL || Unic == NULL) return 0;// b1 表示UTF-8编码的pInput中的高字节, b2 表示次高字节, ...  char b1, b2, b3, b4, b5, b6;*Unic = 0x0; // 把 *Unic 初始化为全零  int utfbytes = enc_get_utf8_size(*pInput);unsigned char *pOutput = (unsigned char *)Unic;switch (utfbytes){

关于GBK与Unicode,utf8区别

GBK对于单片机开发的应该不陌生,目前有几个版本,但是都是往下兼容,用的时候其实也没啥顾忌的。常用的是GB2312与GB18030,前者虽然收录的汉字不全(其实最新也未必全,毕竟每时每刻都有可能有新的汉字被收录),但是起码常用的都有,占用的空间也相对小很多,适合rom小的设备使用。后者就相对全很多,不用担心输入生僻字却显示了寂寞。在window上如果设置地区是中国或者语言是大陆的,编码其实都是GBK的编码。对于中文来说一个汉字占用2个字节。

Unicode相对国际化一点可以表示世界内所有文字(前提是收录进去了),最大4个字节代表一个字。我们常用的短信其实就是用Unicode编码的。对于中文来说一个汉字占用2个字节(大概)

utf-8是Unicode变种而来,可能因为好用吧,基本服务器跟浏览器都是使用utf-8替代以前的Unicode,可能还有一些没改,但是主流都是使用这个了,相信不久就全部都改成utf-8。所以基本我们使用的话都是将utf-8转成我们系统上所使用的编码。对于中文来说一个汉字占用3个字节

eg:对于英文及普通字符,所有编码都是一样的,都是占用一个字节 ,详细可以查看ASCII表

分享一个网站 http://www.mytju.com/classCode/tools/encode_gb2312.asp

这个可以查看文字所对应的数据是怎样的

比如中文  ‘一’

对应GBK为        0xD2BB

对应Unicode为        0x4E00

对应utf-8为        0xE4B880

关于GBK与Unicode,utf8互转,这里是使用查表法,首先都是GBK与Unicode之间相互转化,再进而转成utf8

WCHAR ff_convert (   /* Converted code, 0 means conversion error */WCHAR chr,    /* Character code to be converted */UINT    dir     /* 0: Unicode to OEM code, 1: OEM code to Unicode */
)
{const WCHAR *p;WCHAR c;int i, n, li, hi;if (chr < 0x80) {   /* ASCII */c = chr;} else {if (dir) {      /* OEM code to unicode */p = oem2uni;hi = sizeof oem2uni / 4 - 1;} else {     /* Unicode to OEM code */p = uni2oem;hi = sizeof uni2oem / 4 - 1;}li = 0;for (n = 16; n; n--) {i = li + (hi - li) / 2;if (chr == p[i * 2]) break;if (chr > p[i * 2])li = i;elsehi = i;}c = n ? p[i * 2 + 1] : 0;}return c;
}

其中 oem2uni与uni2oem就是对应的表

下面提供了自己整理的函数跟测试例子,大家可以按需求下载,都是一样的文件。转换有的是单个转换有的是整个数组一次性转的,使用的时候要看清楚。

免费共享通道

链接:https://pan.baidu.com/s/1dbX-_som28s61I4P_wzRBg 
提取码:i0g1

付费支持下载

https://download.csdn.net/download/qq_41851997/20979303

来源、参考、鸣谢(部分,还有忘了找不到,不代表最终来源)

https://www.amobbs.com/thread-4805076-1-1.html
https://www.cnblogs.com/mickole/articles/3663924.html

cc936.c -- 正点原子

GBK,Unicode,UTF-8相互转化 C语言相关推荐

  1. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  2. 字符编码ASCII、Unicode 、UTF-8 及实例汉字与Unicode码的相互转化

    字符编码ASCII.Unicode .UTF-8 及实例汉字与Unicode码的相互转化 ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态, ...

  3. 计算机编码种类(ASCII/gbk/unicode/utf-8)

    计算机编码的作用 主要是解决将文字转换为二进制码的过程: bytes–>encode–> str --> decode --> bytes ASCII 只适合英文编码,用一个字 ...

  4. 在nodejs中将GBK转UTF

    问题 在对接第三方接口时接口返回的响应数据格式为GBK而服务端语言使用的是nodejs 于是常规的方式接收到数据后中文呈现乱码 心路历程 通过网上查找解决方案,最多的就是使用以下方式将GBK转为UTF ...

  5. ASCII,GBK,Unicode(UTF-32/UTF-8),乱码,ANSI详解

    前言 总目录 日常开发过程中,经常会遇到ASCII,GBK,Unicode(UTF-32/UTF-8)等名词,对于这些概念是不是有点傻傻分不清呢?相信看下本文,你会有自己的理解. 一.ASCII码 1 ...

  6. C#_汉字与GBK,Unicode,UTF-8编码之间的转换

    IT发展至今,字符编码版本众多,目前流行的GBK,Unicode,UTF-8编码与汉字的转换可用如下代码: private void button1_Click(object sender, Even ...

  7. 初识编码 gbk unicode utf-8

    初识编码 gbk unicode utf-8 1. ascii 8bit 1byte(字节) 256个码位 只用到了7bit, 用到了前128个 最前面的一位是0 2. 中国人自己对计算机编码进行统计 ...

  8. html批量转码工具,文件转码工具(文件GBK与UTF编码批量转码工具)

    这是一个将批量的txt文件转换成Unicode编码的工具,转换的速度快,使用简单. 什么是Unicod编码? Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.Unicode 是 ...

  9. 码表的理解(ASCII,GBK,Unicode,UTF-8等)。

    以下任何言论都完全是个人的理解,如有雷同纯属巧合,如有错误,希望大家多多指出,共同学习!谢谢! 笔者是一个理解能力偏慢.稍钻牛角尖的程序员,什么东西都要从最基础理解起,一步一步向上理解,因此讲述时也是 ...

  10. ASCII, GB2312, GBK, Unicode, UTF8之间的区别和联系

    原文链接:https://zhuanlan.zhihu.com/p/258345888 感谢原作者的分享~本博客仅仅是为了做笔记 计算机是美国人发明的, 早期在处理文字方面, 美国人很自然地只考虑处理 ...

最新文章

  1. 阿里云参加ONS EU 2018,飞天洛神亮相网络顶会
  2. C++中序列化对象并存储到mysql
  3. Python工程师必看的面试问题与解答(中) 1
  4. ASP.NET网站SESSION丢失的问题
  5. 花生壳+FileZilla搭建公网FTP服务器
  6. c语言乐谱提取软件,SmartScore X2 Pro(乐谱扫描识别软件) V10.5.4 官方版
  7. 计算机一寸照编辑教程,超简单的一寸照制作及排版教程,再也不花冤枉钱!
  8. ELK日志系统设计方案-Log4j日志直推Kafka
  9. java timezone 中国_Java中TimeZone类的常用方法
  10. php 导出word怎么分页,php 导出Word怎么分页
  11. 安恒 web类这可不是难题_如何消除您的前5个Web设计难题
  12. R语言入门——猜数游戏
  13. php 路径解析,ThinkPHP 5 结构与路径解析
  14. 'Did you install mysqlclient or MySQL-python?' % e 'Did you install mysqlclient or MySQL-pyth
  15. 期货反向跟单--有趣儿的差异化
  16. 大物设计性实验:电容、电感量的测量
  17. 开酒馆前的注意事项 (下)
  18. COLA 架构使用规范化
  19. 服务器系统linux当nas,使用Ubuntu 13.10当NAS服务器系统
  20. PMI-ACP练习题(14)

热门文章

  1. 华北电力计算机学什么,华北电力大学有什么王牌专业?北京人眼中如何?
  2. 《阴阳师·4蟾蜍》原作:梦枕貘
  3. go语言入门(转载自开源社区)
  4. MySQL - redolog 图文详解
  5. txt文件内容导入mysql数据库中_将txt文件导入mysql数据库
  6. C++向量夹角公式(带正负)
  7. WIN10 运行cmd显示“系统无法找到指定的路径”
  8. 当下OA系统的使用缺陷以及相关解决方案
  9. OpenCL 简单概念
  10. 搭建静态的响应式个人官网