URL链接中汉字乱码转UTF-8和gb2312
2016-04-02 18:45
344 查看
在使用URL向服务器提交数据的时候,如果我们提交的数据中存在汉字,就会出现下列情况
http://192.168.11.22/cgi-bin/serial.cgi?type=text&text=%C9%DB%CD%FB%C8%A8
%C9%DB%CD%FB%C8%A8代表着什么,不是我们想要的数据,那它是什么呢?
去除所有%号:C9DBCDFBC8A8使用汉字内码查询可以看到
gb2312
两个字节表示一个汉字
注:在终端先可以正确输出‘邵’,(使用gb2312编码,在linux下输出乱码,Windows下正常输出)
utf-8
三个字节表示一个汉字
**十六进制转十进制可使用:strtol函数
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。
http://192.168.11.22/cgi-bin/serial.cgi?type=text&text=%C9%DB%CD%FB%C8%A8
%C9%DB%CD%FB%C8%A8代表着什么,不是我们想要的数据,那它是什么呢?
去除所有%号:C9DBCDFBC8A8使用汉字内码查询可以看到
将汉字内码转成一个汉字
gb2312两个字节表示一个汉字
#include <stdio.h> #include <string.h> int main(void) { char str[3]; str[0]=201; /*201为C9的十进制值*/ str[1]=219; /*219为DB的十进制值*/ str[2]='\0'; printf("C9DB的汉字的值为:%s",str); return 0; }
注:在终端先可以正确输出‘邵’,(使用gb2312编码,在linux下输出乱码,Windows下正常输出)
utf-8
三个字节表示一个汉字
多个汉字输出
/*将十六进制数转为十进制*/ int hex_to_decade(char * s) { char *digits="0123456789ABCDEF"; /*判断大小写,小写的话转为大写,达到统一*/ if (islower (s[0])) s[0]=toupper(s[0]); if (islower (s[1])) s[1]=toupper(s[1]); return 16*(strchr(digits,s[0])-strchr(digits,'0'))+(strchr(digits,s[1])-strchr(digits,'0')); } void url_to_gb_or_utf(char *get_url, char *return_gb_or_utf) { int url_position;/*用来保存get_url的位置*/ int return_position;/*用来保存解码后的字符串的位置*/ int url_len;/*用来保存get_url的长度*/ char tmp[2];/*保存%后面的十六进制字符*/ url_len = strlen(get_url); return_position = 0; fprintf(stdout, "length=%d\n", url_len); for ( url_position = 0; url_position < url_len; ) { /*如果是%将它后面的十六进制字符考到数组里*/ if ( get_url[url_position] == '%' ){ tmp[0] = get_url[url_position+1];/*第一个十六进制字符*/ tmp[1] = get_url[url_position+2];/*第二个*/ // tmp[2] = '\0'; **串口通信中会出现乱码,结尾必须不能有其他字符** url_position+= 3; /*使url_position跳到的下一个%*/ /*将十六进制数转为十进制后考入要返回的数组里*/ return_gb_or_utf[return_position] = hex_to_decade(tmp); fprintf(stdout, "------%d\n", return_gb_or_utf[return_position] ); } /*如果不是特殊字符,如英文,数字那么直接返回*/ else{ return_gb_or_utf[return_position] = get_url[url_position]; url_position++; } return_position++; } return_gb_or_utf[return_position] = 0; }
**十六进制转十进制可使用:strtol函数
汉字编码
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。
相关文章推荐
- java-用HttpURLConnection发送Http请求.
- 我是运营,我没有假期
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- VBScript 剪贴板抓取URL并在浏览器中打开
- 修复mysql数据库
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- C#实现窗体间传递数据实例
- 用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
- C#中的委托数据类型简介
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法
- Oracle数据库数据丢失恢复的几种方法总结
- asp获取URL参数的几种方法分析总结[原创]_应用技巧_脚本之家
- C#将Sql数据保存到Excel文件中的方法
- C#实例代码之抽奖升级版可以经表格数据导入数据库,抽奖设置,补抽