ASCII与Unicode编码消息写文件浅析
【文章摘要】
ASCII与Unicode是两种常见的字符编码。它们的表示方法不一样,因而在程序中就要区别处理。
本文基于作者的实际开发经验,对ASCII与Unicode两种字符编码消息的写文件过程进行了详细的分析,为相关软件开发工作的开展提供了有益的参考。
【关键词】
ASCII Unicode C语言 编码 开发
一、ASCII与Unicode编码简介
1. ASCII编码简介
ASCII是一套基于拉丁字母的电脑编码系统。它使用指定的7位或8位二进制数的组合来表示128或256 种可能的字符。
标准ASCII码使用7位二进制数来表示所有的大写和小写字母、数字0到9、标点符号, 以及在美式英语中使用的特殊控制字符。
2. Unicode编码简介
Unicode码是一种国际标准编码,采用二个字节编码,与ASCII码不兼容。目前普遍采用的是UCS-2。
Unicode编码从0到127的字符与ASCII编码的字符一样,比如字母“a”的Unicode编码是0x0061,十进制是97;而“a”的ASCII编码是0x61,十进制也是97。
二、对ASCII与Unicode编码消息写文件的处理
1. 需求描述
在某版本的需求中,要求某模块将另一模块发过来的短信消息写到文件中,该消息的编码格式为ASCII或Unicode。
2. 对两种编码消息写文件的处理
(1) ASCII编码消息的处理
对于ASCII编码的消息,可直接将消息内容写入文件中,不用做任何额外的处理。
(2) Unicode编码消息的处理
对于Unicode编码的消息,需要在要写入的文件头部添加“FFFE”(小端模式)或“FEFF”(大端模式),然后将消息内容拼接到后面。大、小端模式要和发端模块约定好,在本模块的配置文件中控制当时发送的消息是小端模式还是大端模式。
大端模式,是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中;小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。
三、C程序实现
基于第二部分的需求和分析,程序框架如下所示:
……
char szFileContent[1024] = {0};
char szFileName[1024] = {0};
int iFileSize = 0;
unsigned char a = 0xFF;
unsigned char b = 0xFE;
int fd = 0; // 文件句柄
if (iMsgFmt == 1) // Unicode编码格式
{
if (gConfig.iUseBigEndianOrLittleEndian == 0) // 小端模式FFFE
{
szFileContent[0] = a;
szFileContent[1] = b;
}
else if(gConfig.iUseBigEndianOrLittleEndian == 1) // 大端模式FEFF
{
szFileContent[0] = b;
szFileContent[1] = a;
}
// 将消息内容szMsgContent拷贝到szFileContent中,注意要+2
memcpy(szFileContent+2, szMsgContent, iMsgLength);
}
else // ASCII编码格式
{
memcpy(szFileContent, szMsgContent, iMsgLength); // 直接拷贝
}
// 将内容写到文件中
if ((fd = open(szFileName, O_RDWR | O_CREAT, S_IRWXU |S_IRWXG| S_IRWXO )) <= 0)
{
WRITELOGEX(LOG_ERROR, ("exec open failed. FileName=%s", szFileName));
return ERR_GENERAL;
}
// 保存内容
lseek(fd, 0, SEEK_SET);
if (iMsgFmt == 1) // Unicode编码格式
{
// 因为在文件头部新增加了两个字节,因此要在原长度基础上加2
iFileSize = iMsgLength+2;
if (write(fd, szFileContent, iFileSize) != iFileSize) // 写文件
{
WRITELOGEX(LOG_ERROR, ("exec write failed. FileName=%s", szFileName));
close(fd);
fd = 0;
return ERR_GENERAL;
}
}
else // ASCII编码格式
{
iFileSize = iMsgLength; // 长度不变
if (write(fd, szFileContent, iFileSize) != iFileSize) // 写文件
{
WRITELOGEX(LOG_ERROR, ("exec write failed. FileName=%s",szFileName));
close(fd);
fd = 0;
return ERR_GENERAL;
}
}
// 写文件成功
WRITELOGEX(LOG_INFO, ("exec write successfully. FileName=%s",szFileName));
close(fd);
fd = 0;
四、总结
本文对ASCII与Unicode两种字符编码进行了简单的分析,并用C语言代码演示了两种编码消息的整个写文件的过程。因为字符编码格式的多样性,所以我们要根据每种编码的特点来进行写文件的操作。本文为相关软件项目根据不同编码格式写文件的开发工作的开展提供了有益的参考。
(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)
ASCII与Unicode编码消息写文件浅析相关推荐
- ASCII码、Unicode编码对照表 —— ASCII控制字符 Unicode编码 字符编码的前世此生
ASCII控制字符 Unicode编码 ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字 ...
- pugixml读取unicode编码的xml文件的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 实际上在多字节编码的情况下,即以记事本打开显示的ANSI编码的,如下图: pugixml是可以直接读取中文字符的,示例 ...
- ASCII和Unicode编码
原文:http://blog.csdn.net/hjsunj/article/details/2223766 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世 ...
- 将unicode编码的txt文件转为utf-8编码
利用codes编写: # coding=UTF-8import stringimport codecsdef changecode(): tt=codecs.open('c:\\111.txt','r ...
- vnc viewer复制到linux乱码,VNC拷出来的文字变成了ASCII的unicode编码
在Windows上用RealVNC Viewer访问Linux服务器时,想把VNC中的命令执行结果拷出来,贴到Excel中做文档. 不做设置当然是不能copy的了,要单独开个terminal,执行 % ...
- WPS插件 - 保存Unicode编码的CSV文件
目的 CSV 配置文件使用UTF8-BOM编码格式,但是,无论是 Office 还是 WPS 打开 CSV 后的保存,都会将 CSV 文件改成 ANSI 编码.另外,保存时出现偏僻字符变成问号.长数字 ...
- 读取unicode编码文件的乱码解决
首先,有必要了解下记事本文件的几种编码方式: 四种常见文本文件编码方式研究 ANSI.UNICODE .UNICODE big endian.UTF-8四种格式编码存在差别,简要介绍如下: ANSI编 ...
- java unicode转ascii码_Java用native2ascii命令做unicode编码转换
背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码.原因是java ...
- python 中文转unicode编码_python实现unicode转中文及转换默认编码的方法
本文实例讲述了python实现unicode转中文及转换默认编码的方法.分享给大家供大家参考,具体如下: 一.在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77e ...
最新文章
- 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能
- Java中的文件路径
- 会员日亚马逊工人罢工:反抗“与机器比速度”的考核制!
- html点击按钮切换图片代码_SVG创意推文—『点击开窗』教程
- r语言 xmlto html,R语言XML文件
- leetcode 794. Valid Tic-Tac-Toe State | 794. 有效的井字游戏(Java)
- C# 简单日志文本输出
- cadence设计运算放大器_「好设计论文」一种用于高精度DAC的实用型CMOS带隙基准源...
- navicat运行db文件_navicat导入db文件_db文件转换为txt
- 计算机窗口闪屏,电脑玩游戏闪屏是什么原因(对应的解决方法)
- matlab按图像边缘抠图_有哪些高效的抠图方法?
- dimm和udimm_服务器内存类型UDIMM、RDIMM和LRDIMM比较
- 【无标题】汇编实验-学生成绩管理系统
- 计算机考研专业课科目834,2018考研华中科技大学834计算机专业基础综合考试大纲...
- STC51单片机15——MPU6050六轴数据融合,互补滤波,时间常数可调,可稳定运行,串口显示角度值
- 笨办法学python 习题46-windows
- java基础语法函数题(pta)
- 【HEVC简介】CTU、CU、PU、TU结构
- 最新手机枰测出炉 iPhone X仅仅名列第9名
- int在c语言是什么意思,c语言int是什么意思-与非网