ASCII與Unicode編碼訊息寫檔案淺析,asciiunicode
【文章摘要】
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,歡迎關注!)
對於c++程式從 ascII編碼到unicode編碼的轉換
用MultiByteToWideChar和WideCharToMultiByte可以做到編碼的轉換。char和unsigned char不是一樣的嗎,沒區別吧,無需轉換?若是unicode編碼的類型記得是wchar_t吧,或者用WCHAR。_T是將作用是讓你的程式支援Unicode編碼的,若你當前程式定義為ANSI,那麼這個宏就什麼都不做,若定義為unicode則將字串常量(不是變數)類型轉為unicode,記得是如此,有點淡忘了,嘿。TCHAR也是個宏,ansi程式就是定義成char,unicode的時候就變成WCHAR了。
Unicode編碼重新儲存此檔案,是什?
是說你的程式SampleApp.cpp現在含有 非ASCII 編碼字元,並判斷為 那些字元屬 unicode 編碼,問你是否要按 unicode 編碼存放此檔案。
如果不按照 unicode,則存為 普通的 ASCII 編碼文字檔,unicode字元資訊將丟失。
如果按 unicode 編碼存放此檔案,unicode字元資訊將不會丟失。
SampleApp.cpp按ASCII檔案存放過了,如果你不選擇重新存放為 unicode 檔案,則 SampleApp.cpp檔案裡將不含unicode字元。