天天看點

SourceInsight讀取代碼亂碼——>MATLAB批量轉化檔案,從字元編碼UTF-8為ANSI1、字元編碼的方式2、單個轉換檔案[從字元編碼UTF-8為ANSI]3、批量轉換檔案[從字元編碼UTF-8為ANSI]

1、字元編碼的方式

正式動手之前,首先需要了解一下字元編碼的方式,詳見:https://www.jianshu.com/p/1f36bc2a247f

2、單個轉換檔案[從字元編碼UTF-8為ANSI]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%實作功能%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%       說明:檔案“1.cpp”字元編碼方式為utf-8
%       功能:将檔案“1.cpp”中的内容拷貝至檔案'2.cpp',
%             并将檔案'2.cpp'以ANSI編碼格式儲存。
%       注意:該腳本檔案和所處理的檔案務必在相同路徑
clear
clc

fin=fopen('1.cpp','r','n','utf-8');%以utf-8方式打開該檔案
if fin>0
    fout=fopen('2.cpp','w');%預設寫入的方式就是ANSI編碼格式
end
while ~feof(fin) 
   % 函數feof(fid)用法:檔案指針 fid 到達檔案末尾時傳回“真”值;否則傳回“假”;
      % while ~feof: 表示若未讀到檔案末尾,則繼續循環
   % 函數fgetl功能:從檔案中讀取一行資料,并去掉行末的換行符。 
      % 文法格式:tline = fgetl(fid) 
      % fid是通過fopen函數打開檔案後得到的一個整型的檔案辨別。
      % fgetl從這個檔案中讀取一行資料并丢棄其中的換行符。如果讀取成功,tline容納了讀取到的文本字元串,如果遇到檔案末尾的結束标志(EOF),則函數傳回-1,即tline值為-1。 
      % 傳回的字元串tline并不包含文本行的行終止符。要得到行終止符,可以使用函數fgets
    tline = fgetl(fin)
    for i=1:length(tline)
        if (~strncmp(tline(i),' '' ',1))%比較字元串
            fprintf(fout,'%s',tline(i));               
        end
    end
     fprintf(fout,'\r\n');
end
fclose(fin);
fclose(fout);
           

3、批量轉換檔案[從字元編碼UTF-8為ANSI]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%實作功能%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%     說明:檔案夾中所有.cpp檔案和.h檔案的字元編碼方式為utf-8,
%          該檔案夾中可能還存在其他格式檔案[即字尾名不是.cpp、.h,這些檔案不做任何處理]。
%     功能:和單個檔案處理的功能相同,這裡是針對一個檔案夾下所有檔案進行處理
%           将轉換好的檔案統一存儲在檔案夾“修改後的(ANSI編碼)”
%     注意:該腳本檔案和所處理的檔案務必在相同路徑
clc
clear

path = 'C:\Users\Administrator\Desktop\SourceInsight\WaveCollect';%目錄的路徑
listing = dir(path);%擷取目錄中所有檔案的名稱,以結構體的形式存儲
length(listing);%目前目錄下一共有多少個檔案
cout = 1;

path2 = '修改後的(ANSI編碼)'
mkdir (path2)


%% 周遊所有目錄中所有的檔案,過濾'.cpp'檔案和'.h'檔案
for i = 1:1:length(listing)
    %過濾'.cpp'檔案和'.h'檔案
   if listing(i).name(length(listing(i).name)) == 'p' ||  listing(i).name(length(listing(i).name)) == 'h'
       fileName = listing(i).name
       
       
    %%%檔案編碼格式轉換%%%    
       temp = num2str(cout);
       cout = cout + 1;
       fileName2 = strcat(temp, fileName);
       path_fileName2 = fullfile(path2, fileName2);%将檔案夾和檔案名稱拼接在一起
       
        fin=fopen(fileName,'r','n','utf-8');%以utf-8方式打開該檔案
        if fin>0
            fout=fopen(path_fileName2,'w');%預設寫入的方式就是ANSI編碼格式
        end
        while ~feof(fin) 
              % 函數feof(fid)用法:檔案指針 fid 到達檔案末尾時傳回“真”值;否則傳回“假”;
              % while ~feof 表示 若 未讀到檔案末尾 則 繼續 循環
              % 函數fgetl功能:從檔案中讀取一行資料,并去掉行末的換行符。 
              % 文法格式:tline = fgetl(fid) 
              % fid是通過fopen函數打開檔案後得到的一個整型的檔案辨別。fgetl從這個檔案中讀取一行資料并丢棄其中的換行符。如果讀取成功,tline容納了讀取到的文本字元串,如果遇到檔案末尾的結束标志(EOF),則函數傳回-1,即tline值為-1。 
              % 傳回的字元串tline并不包含文本行的行終止符。要得到行終止符,可以使用函數fgets
            tline = fgetl(fin);
            for i=1:length(tline)
                if (~strncmp(tline(i),' '' ',1)) 
                    fprintf(fout,'%s',tline(i));               
                end
            end
             fprintf(fout,'\r\n');
        end
        fclose(fin);
        fclose(fout);
       
       
   end 
end
           

繼續閱讀