1. 程式人生 > >VC 程式設計ANSI環境下讀寫Unicode檔案

VC 程式設計ANSI環境下讀寫Unicode檔案

       沒有注意到檔案編碼的不同會產生這麼多的問題,在動手以前查詢了很多資料,在本部落格中收藏了不少先輩的成果,在這裡一併表示致敬!
       關於ANSI和Unicode編碼的原理在這裡也不說了,主要講下如何讀寫!
       首先確定你的工程是採用的是什麼編碼環境,預設是ANSI,不同的字符集讀寫檔案的差別也比較大,我這裡只在ANSI環境下做的,下一步在探索在Unicode環境下如何讀寫!(原先這個沒搞懂,讀了不少程式碼發現自己試驗都是有誤的)。
       在ANSI的字符集下,CString等都是單位元組版本的,所以一定要注意。而多要讀取的Unicode檔案卻是雙位元組的,這裡就要轉換了,當然在ANSI字符集下,還是用二進位制的方式開啟Unicode檔案,自己判斷是否是換行,在轉化成ANSI編碼。而在寫Unicode的時候,先將所字元轉化成Unicode編碼再寫入,而且在寫檔案之前一定要加上Unicode檔案的標識。
下面是讀


   CFile mFile(UnicodefilePath,CFile::modeRead);
   byte head[2];
   mFile.Read(head,2);  
   if((head[0]==0xff&&head[1]==0xfe)||(head[0]==0xfe&&head[1]==0xff)   )
   {
    //AfxMessageBox(_T("File is Unicode!"));
    isUnicode = true;
   }
if(isUnicode) mFile.Seek(2,CFile::begin);//0xfffe
wchar_t wch;
wchar_t wstr[300];

CString strvalue ;
hile(mFile.Read((char *)&wch,2)>0)
{
   if(wch==0x000D)//by line
   {
    //chang to ansi
    int nLen = i;
    char *buf = new char[2*nLen];
    WideCharToMultiByte(CP_ACP, 0, wstr, nLen, buf, 2*nLen, NULL, NULL);
    buf[2*nLen-1] = 0; //some assertion failed,這個比較重要,小問題可以折騰人啊
   strvalue = buf;
    mFile.Seek(2,CFile::current);//跳過行開頭符號
    i=0;
}
   else
   {
    wstr[i++] = wch;
   }
}
//下面是寫


CStdioFile transFile;
transFile.Open(strUnicodeSavepath,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
WORD wSignature = 0xFEFF;
transFile.Write(&wSignature, 2);//Unicode的檔案符號
   CHAR *pszAnsi = new TCHAR[strvalue.GetLength()+1];
   _tcscpy(pszAnsi, strvalue);
   WCHAR * szwBuffer = new WCHAR[strvalue.GetLength()+1];
   MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, szwBuffer, strvalue.GetLength()+1);
   //write to files
   transFile.Write(szwBuffer, lstrlenW(szwBuffer) * sizeof(WCHAR));
當然你可以把你的工程設定成Unicode的字符集,這個時候在Unicode的工程下讀取ANSI檔案又是一個煩人的事情,講檔案讀到CString中的時候,每個單位元組的ANSI被轉成了雙位元組,需要自己來處理,後面我再探索探索再來記錄。

相關推薦

VC 程式設計ANSI環境Unicode檔案

       沒有注意到檔案編碼的不同會產生這麼多的問題,在動手以前查詢了很多資料,在本部落格中收藏了不少先輩的成果,在這裡一併表示致敬!       關於ANSI和Unicode編碼的原理在這裡也不說了,主要講下如何讀寫!       首先確定你的工程是採用的是什麼編碼環境,預設是ANSI,不同的字符集讀

UNICODE環境txt檔案操作

自己動手整理了一下,寫了幾個函式,用於UNICODE環境下對txt文字檔案的操作,針對txt文字的ANSIC編碼格式,進行了字元編碼格式的轉換。 *****************************************************************

UNICODE環境txt文件操作

clas c程序 delete tag 編碼 eno 字符編碼 empty readline 內容轉載自http://blog.sina.com.cn/s/blog_5d2bad130100t0x9.html UNICODE環境下讀寫txt文件操作 (2011-07

【程式碼備忘】C++ fstream unicode 檔案

歡迎加入我們的QQ群,無論你是否工作,學生,只要有c / vc / c++ 程式設計經驗,就來吧!158427611  所謂的unicode檔案,無非就是在檔案頭部插入了 0xFFFE的標誌。。。讀寫的時候對應的讀寫 就可以了。 namespace fileStream

C++ fstream unicode 檔案

所謂的unicode檔案,無非就是在檔案頭部插入了 0xFFFE的標誌。。。讀寫的時候對應的讀寫 就可以了。namespace fileStream  {      bool readFile_Unicode( const string &file ,wstring 

Mac NTFS檔案

Mac OS 版本:10.11.16  (OS X EI Capitan) 文章末尾附上小白使用使用方式 1、首先插入需要寫入檔案的NTFS格式的U盤或行動硬碟 2、開啟終端,然後執行以下命令,會提示輸入密碼,輸入當前登入賬號的密碼即可,如果不行請輸入root賬號的

pythonunicode檔案之utf-16

很多文章都提到了 import codecs,的確! 但是有的在處理unicode時只考慮utf-8,或者簡單utf-16. 但是utf-16使用時還容易報錯,原因就是utf-16會預設檢測BOM(byte order mark),如果有的檔案建立時沒有,則python無法

sparklzo檔案(java)

1、編譯安裝hadoop-lzo 這個網上已經說的很詳細了,具體可以參考這個連結: 2、具體如何配置lzo,上面的文件已經有了,但是為了討論問題,這裡再複製一下: a、修改hadoop配置檔案core-site.xml  Xml程式碼  <prope

MFC在Unicode字符集ANSI編碼檔案

讀取ANSI編碼檔案時,先將檔案儲存在char*指向的記憶體內,而後使用轉換將char*轉換為w_char_t*。wchar_t*可以使用CString的 Format函式。 CFile file(_T("test.txt"), CFile::modeRead);//讀ANSI編碼的檔案 i

VC ANSI環境按行讀取ANSIUNICODEUNICODE big endian、UTF-8四種文字檔案

1.問題提出 MFC提供的檔案類CStdioFile,其中一個函式ReadString實現了檔案的按行讀取,但是不能滿足不同型別的文字檔案的按行讀取,為了解決這一問題,筆者初步研究了一些編碼知識,參考了網上的一些資料,實現了CStdioFile類的擴充套件類CStdioFileEx,完成了常見文字檔案的按行讀

VS2013在Unicode字符集ANSI編碼檔案

讀取ANSI編碼的檔案時,現將檔案儲存在char* 指向的記憶體內,而後使用轉換將char*轉換為wchar_t*。wchar_t*可以使用CString的Format函式。 CFile file(_

Linux學習筆記-Linux檔案

在Linux程式設計需要讀寫檔案時,有兩種方式: (1)ANSIC: 使用stdio.h裡的函式。fopen, fclose, fwrite, fread (2)Linux API:Linux提供了另外一套API用於操作檔案。open, clos

QtXML格式檔案(使用QDomDocument類)

簡述 XML是一種標記語言,被設計用來結構化儲存以及傳輸資訊,是一種常用的文件資料結構。 就我個人而言,Qt下讀寫XML格式檔案可以有三種方法: 一是使用純C++的rapidxml開源庫。優點是速度快,媲美strlen()的速度;缺點是處理中文比較麻煩,編碼只有ANSI格式。 二是使用Q

在VS2017環境動手你的第一個DLL(轉載)

在VS2017環境下,開始寫自己的第一個DLL(動態連結庫),(本人小白,如果文章中有什麼錯誤,還請各位指點)     首先介紹一下什麼是動態連結庫,我們平常在安裝遊戲,安裝軟體的時候,有的時候就會提示你,無法開啟。。。由於缺失。。。.dll檔案,請重新安裝。這就是由於安

java併發程式設計系列之ReadWriteLock鎖的使用

前面我們講解了Lock的使用,下面我們來講解一下ReadWriteLock鎖的使用,顧明思義,讀寫鎖在讀的時候,上讀鎖,在寫的時候,上寫鎖,這樣就很巧妙的解決synchronized的一個性能問題:讀與讀之間互斥。 ReadWriteLock也是一個介面,原型如下: pub

VCword檔案(RTF檔案

這幾天一直在研究VC讀寫有格式文字檔案(RTF檔案)的方法,終於動明白一些,下面是我的程式碼,在VS2005下執行正常,希望能幫助大家解決一點問題,若有書寫不周,歡迎各位批評指正 。 void CVCreadwriteRTFDlg::OnBnClickedButton1()

Spark -14:spark Hadoop 高可用模式hdfs

  第一種,通過配置檔案   val sc = new SparkContext()     sc.hadoopConfiguration.set("fs.defaultFS", "hdfs://cl

在SpringBoot的環境上傳檔案的功能,結果沒有獲取到檔案的問題(ServletFileUpload中getItemIterator(request)為空)

在SpringBoot的環境下,寫上傳檔案的功能,結果沒有獲取到檔案的問題: 情況一: 使用Apache Commons FileUpload 元件上傳檔案時總是返回null,multipart/form-data型別檔案的接收。 <!DOCTYPE html>

VC++ 實現INI文件操作

c++ word 開發 rfi oid 格式 ++ 路徑 lse 轉載:https://blog.csdn.net/fan380485838/article/details/73188420 在實際項目開發中,會用ini配置文件,在此總結一下對ini讀寫操作 一:讀in

如何在VC++6.0環境刪除新增的工程類

在自己的建立的工程下如果添加了一個類,而又不想要在其中工程用使用它。那麼 1.先在工程資料夾下刪除該類的.CPP和.h檔案 2.刪除.clw檔案 3.開啟工程,在檔案檢視下,選中該類的標頭檔案和原始檔,Delete it 4.開啟建立類嚮導,會提示你建立.clw檔案,那麼就