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賬號的
python讀寫unicode檔案之utf-16
很多文章都提到了 import codecs,的確! 但是有的在處理unicode時只考慮utf-8,或者簡單utf-16. 但是utf-16使用時還容易報錯,原因就是utf-16會預設檢測BOM(byte order mark),如果有的檔案建立時沒有,則python無法
spark下讀寫lzo檔案(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環境下按行讀取ANSI、UNICODE 、UNICODE 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
Qt下讀寫XML格式檔案(使用QDomDocument類)
簡述 XML是一種標記語言,被設計用來結構化儲存以及傳輸資訊,是一種常用的文件資料結構。 就我個人而言,Qt下讀寫XML格式檔案可以有三種方法: 一是使用純C++的rapidxml開源庫。優點是速度快,媲美strlen()的速度;缺點是處理中文比較麻煩,編碼只有ANSI格式。 二是使用Q
在VS2017環境下動手寫你的第一個DLL(轉載)
在VS2017環境下,開始寫自己的第一個DLL(動態連結庫),(本人小白,如果文章中有什麼錯誤,還請各位指點) 首先介紹一下什麼是動態連結庫,我們平常在安裝遊戲,安裝軟體的時候,有的時候就會提示你,無法開啟。。。由於缺失。。。.dll檔案,請重新安裝。這就是由於安
java併發程式設計系列之ReadWriteLock讀寫鎖的使用
前面我們講解了Lock的使用,下面我們來講解一下ReadWriteLock鎖的使用,顧明思義,讀寫鎖在讀的時候,上讀鎖,在寫的時候,上寫鎖,這樣就很巧妙的解決synchronized的一個性能問題:讀與讀之間互斥。 ReadWriteLock也是一個介面,原型如下: pub
VC讀寫word檔案(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檔案,那麼就