最近老遇到C/C++中中文汉字或符号 编码的问题,网上的大部分资料都是依赖第三方的库来解决的,这里给大家分享一个非库函数实现的编码转换补充。

接着上篇博文的GB2313的简体中文表,最后再添加上缺失的中文标点符号。

  const unsigned short gb2312table[20902] ={//补充中文标点:多了 19 个0xa1ef,//★0xa3ba, 0xa3ac, 0xa1a3, 0xa1a2,//冒号、逗号、句号、顿号::,。、0xa1b6, 0xa1b7,//书名号:《》0xa3bf, 0xa3a1,//问号、感叹号:?!0xa1b0, 0xa1b1,//双引号:“”0xa3a8, 0xa3a9,//括号:()0xa3db, 0xa3dd,//中括号:【】0xa3bb, 0xa1e6,//分号、摄氏度:0xa3a4, 0xa1ad,//人民币、省略号半个:¥…
}

具体值可参考上篇博文GB2312简体中文附录

GB2312简体中文编码表 GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发 布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。 GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定"对任意一个图形字符 都采用两个字节表示,每个字节均采用七位编码表示",习惯上称第一个字节为"高字节",第二个字节为"低字节"。 GB2312-80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中 文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于 0xf7fe。

修正对应关系:

static unsigned short chinese_code(unsigned short unicode)
{if ((unicode >= 0x4e00) && (unicode < 0x9fa6))return (unicode - 0x4e00);else if (unicode == 0xff1a) //冒号return 20903;else if (unicode == 0xff0c) //逗号return 20904;else if (unicode == 0x3002) //句号return 20905;else if (unicode == 0x3001) //顿号return 20906;else if (unicode == 0x300a) //《return 20907;else if (unicode == 0x300b) //》return 20908;else if (unicode == 0xff1f) //?return 20909;else if (unicode == 0xff01) //!return 20910;else if (unicode == 0x201c) //“return 20911;else if (unicode == 0x201d) //”   return 20912;else if (unicode == 0xff08) //(   return 20913;else if (unicode == 0xff09) //)return 20914;else if (unicode == 0x3010) //【 return 20915;else if (unicode == 0x3011) //】return 20916;else if (unicode == 0xff1b) //分号return 20917;else if (unicode == 0x2103) //摄氏度return 20918;else if (unicode == 0xffe5) //人民币return 20919;else if (unicode == 0x2026) //省略号return 20920;elsereturn 20902;
}

修正转换函数:

static char pszBufOut[4300];
char* GBK_Format(const unsigned char* pszBufIn)
{int i = 0;int j = 0, nLen;unsigned short unicode;unsigned short gbk;int nBufInLen = 0;if (pszBufIn == NULL) return NULL;nBufInLen = strlen((char*)pszBufIn);for(; i < nBufInLen; i++, j++){if((pszBufIn[i] & 0x80) == 0x00){nLen = 1;pszBufOut[j]= pszBufIn[i];}else if ((pszBufIn[i] & 0xF0) == 0xE0){if (i+ 2 >= nBufInLen) return NULL;unicode = (((int)(pszBufIn[i] & 0x0F)) << 12) | (((int)(pszBufIn[i+1] & 0x3F)) << 6) | (pszBufIn[i+2]  & 0x3F); gbk = gb2312table[chinese_code(unicode )];pszBufOut[j]= gbk/256;pszBufOut[j+1] = gbk%256;j++;i+=2;}else{return NULL;}}return pszBufOut;
}

最后得到如下结果:

基于C/C++的UTF-8转GBK,补充中文符号的乱码相关推荐

  1. 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案

    基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...

  2. axios请求GBK页面中文乱码解决方法

    axios请求GBK页面中文乱码解决方法 参考文章: (1)axios请求GBK页面中文乱码解决方法 (2)https://www.cnblogs.com/bjhl/articles/10514038 ...

  3. 基于DVB-T标准,COFDM调制系统的利用导频信号进行符号粗同步

    %###### 基于DVB-T标准,COFDM调制系统的利用导频信号进行符号粗同步 ###### %######  仿真条件:68个OFDM符号,64QAM调制,莱斯信道  ###### % IFFT ...

  4. python opencv imshow()显示窗口中文字符出现乱码 解决方案:将utf-8转换为gbk(未能完全解决)

    1 原因分析:这是由于在OpenCV-Python包中,imshow函数的窗口标题是gbk编码,而Python3默认UTF-8编码.因而窗口标题包含中文时,会显示乱码. 解决这个问题,最直接就是从标题 ...

  5. 使用xslt将.xml,转换成一个html网页时中文显示乱码怎么办,用dom将数据写到xml中 设置xml文件gbk编码时中文会出现乱码...

    问题:我用dom将数据写到xml中 设置xml文件的编码格式是gbk时再dos下运行jar包中文会出现乱码 如下: 代码如下: StringWriter strWtr = new StringWrit ...

  6. ubuntu系统下gedit 打开GBK字符集编码文件出现乱码问题解决办法

    使用 Gedit 打开 Windows 系统下编写的文本文件时,文件的中文全是乱码. 有些在Windows下能够打开的txt文件在Ubuntu下用gedit打开时,中文显示是乱码,这是因为编码方式不同 ...

  7. mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题

    2.设计函数,输入为一个字符串,里边包含中文.英文.数字等字符,编码为GBK.中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意.     a) 用常用语言(c/c++/php/ja ...

  8. mysql utf8 gbk_MySql中UTF8 和 GBK 编码中文字符长度问题

    为什么要了解MySql中UTF8 和 GBK 编码中文字符长度呢?举个例子,在oracle中用utf8 字段中文长度为1的话,需要char(3),mysql中则是char(1),如果你按照oracle ...

  9. 转:从头开始编写基于隐含马尔可夫模型HMM的中文分词器

    http://blog.csdn.net/guixunlong/article/details/8925990 从头开始编写基于隐含马尔可夫模型HMM的中文分词器之一 - 资源篇 首先感谢52nlp的 ...

最新文章

  1. 埃森哲:技术改变看病的五大趋势!每个人都将受益【附下载】| 智东西内参...
  2. CF Educational Round 23 F.MEX Queries
  3. 最优化基础和机器学习优化
  4. figma设计_一种在Figma中跟踪设计迭代的简单方法
  5. Kali 2020版 Linux操作系统解决系统语言问题(英文--中文)
  6. (31)Gulp 构建样式文件
  7. php的图像处理有哪些实际作用,PHP_一个经典实用的PHP图像处理类分享,本图像处理类可以完成对图片 - phpStudy...
  8. XStream使用总结
  9. 正则表达式-入门资料
  10. winHex创建指定大小二进制文件.bin(数据为全0或全FF或自己填充)并带winHex软件下载包
  11. 一个词语解释了我万千的苦闷
  12. Python将数字排列组合
  13. java批处理查询_java 实现批量查询
  14. hive窗口函数必备宝典
  15. SpringBoot(二)Error resolving template “xxx”, template might not exist or might not be accessible解决办法
  16. GPS定位模块返回数据的处理
  17. 微软日语输入法使用方法
  18. Eclipse注释日期格式
  19. Python爬虫之煎蛋网图片下载
  20. namesilo修改域名服务器,简单3步修改Namesilo域名DNS以及A记录解析教程

热门文章

  1. 小鼠肺内皮细胞 (MPEC)
  2. 【新番尝鲜】白色相簿——我的女朋友是偶像?
  3. 最新小储云商城V1.782免授权源码
  4. Problem I: 俊爷的局域网
  5. 400G PAM4, ANEG LT 自适应及链路学习(Autonegotiation Link Training),浅析自适应及链路学习功能在400/200/100G PAM4模式
  6. CDS 获取系统日期时间
  7. c++ std::swap() 函数
  8. 公共钥匙盒 Java算法
  9. Android天气预报 源代码,android天气预报源码(国家气象局的接口)
  10. sql根据指定符号拆分字符串表函数