SourceInsight读取代码乱码——>MATLAB批量转化文件,从字符编码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

 

你可能感兴趣的:(MATLAB,UTF-8,ANSI,批量)