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。欢迎关注!
)