首页 > 代码库 > ASCII与Unicode编码消息写文件浅析
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编码消息写文件浅析