基于C/C++的UTF-8转GBK,补充中文符号的乱码
最近老遇到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,补充中文符号的乱码相关推荐
- 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案
基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...
- axios请求GBK页面中文乱码解决方法
axios请求GBK页面中文乱码解决方法 参考文章: (1)axios请求GBK页面中文乱码解决方法 (2)https://www.cnblogs.com/bjhl/articles/10514038 ...
- 基于DVB-T标准,COFDM调制系统的利用导频信号进行符号粗同步
%###### 基于DVB-T标准,COFDM调制系统的利用导频信号进行符号粗同步 ###### %###### 仿真条件:68个OFDM符号,64QAM调制,莱斯信道 ###### % IFFT ...
- python opencv imshow()显示窗口中文字符出现乱码 解决方案:将utf-8转换为gbk(未能完全解决)
1 原因分析:这是由于在OpenCV-Python包中,imshow函数的窗口标题是gbk编码,而Python3默认UTF-8编码.因而窗口标题包含中文时,会显示乱码. 解决这个问题,最直接就是从标题 ...
- 使用xslt将.xml,转换成一个html网页时中文显示乱码怎么办,用dom将数据写到xml中 设置xml文件gbk编码时中文会出现乱码...
问题:我用dom将数据写到xml中 设置xml文件的编码格式是gbk时再dos下运行jar包中文会出现乱码 如下: 代码如下: StringWriter strWtr = new StringWrit ...
- ubuntu系统下gedit 打开GBK字符集编码文件出现乱码问题解决办法
使用 Gedit 打开 Windows 系统下编写的文本文件时,文件的中文全是乱码. 有些在Windows下能够打开的txt文件在Ubuntu下用gedit打开时,中文显示是乱码,这是因为编码方式不同 ...
- mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题
2.设计函数,输入为一个字符串,里边包含中文.英文.数字等字符,编码为GBK.中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意. a) 用常用语言(c/c++/php/ja ...
- mysql utf8 gbk_MySql中UTF8 和 GBK 编码中文字符长度问题
为什么要了解MySql中UTF8 和 GBK 编码中文字符长度呢?举个例子,在oracle中用utf8 字段中文长度为1的话,需要char(3),mysql中则是char(1),如果你按照oracle ...
- 转:从头开始编写基于隐含马尔可夫模型HMM的中文分词器
http://blog.csdn.net/guixunlong/article/details/8925990 从头开始编写基于隐含马尔可夫模型HMM的中文分词器之一 - 资源篇 首先感谢52nlp的 ...
最新文章
- 埃森哲:技术改变看病的五大趋势!每个人都将受益【附下载】| 智东西内参...
- CF Educational Round 23 F.MEX Queries
- 最优化基础和机器学习优化
- figma设计_一种在Figma中跟踪设计迭代的简单方法
- Kali 2020版 Linux操作系统解决系统语言问题(英文--中文)
- (31)Gulp 构建样式文件
- php的图像处理有哪些实际作用,PHP_一个经典实用的PHP图像处理类分享,本图像处理类可以完成对图片 - phpStudy...
- XStream使用总结
- 正则表达式-入门资料
- winHex创建指定大小二进制文件.bin(数据为全0或全FF或自己填充)并带winHex软件下载包
- 一个词语解释了我万千的苦闷
- Python将数字排列组合
- java批处理查询_java 实现批量查询
- hive窗口函数必备宝典
- SpringBoot(二)Error resolving template “xxx”, template might not exist or might not be accessible解决办法
- GPS定位模块返回数据的处理
- 微软日语输入法使用方法
- Eclipse注释日期格式
- Python爬虫之煎蛋网图片下载
- namesilo修改域名服务器,简单3步修改Namesilo域名DNS以及A记录解析教程
热门文章
- 小鼠肺内皮细胞 (MPEC)
- 【新番尝鲜】白色相簿——我的女朋友是偶像?
- 最新小储云商城V1.782免授权源码
- Problem I: 俊爷的局域网
- 400G PAM4, ANEG LT 自适应及链路学习(Autonegotiation Link Training),浅析自适应及链路学习功能在400/200/100G PAM4模式
- CDS 获取系统日期时间
- c++ std::swap() 函数
- 公共钥匙盒 Java算法
- Android天气预报 源代码,android天气预报源码(国家气象局的接口)
- sql根据指定符号拆分字符串表函数