admin 管理员组

文章数量: 1086019


2024年3月12日发(作者:安装idea 2022教程)

……………………………………… ………………… 

实用第一 智慧密集 

. 

用VC++编程实现转换文本文件的字符编码 

马创新 

摘 要:介绍了使用Vc++实现转换文本文件字符编码的方法,可使文本文件的字符编码在 

Unicode、Big5、UTF8、GBK等编码之间实现自由转换。 

关键词:VC++; 字符编码;Unicode;Big5;UTF8;GBK 

件”中选择或者直接输入需要转化的文件路径及其名称.然后 

根据需要点击界面中间的命令按钮即可。所生成的新文件名称 

会在界面最下方的编辑框中显示出来。 

1 引言 

世界上存在多种文字,在用计算机处理文字信息时,为了 

节省存储空间、提高处理速度,一些国家和地区为文字制定了 

相应的字符集,有的一种文字存在多种字符集。字符集可以以 

表格形式描述为字符到单字节值或多字节值的映射。ASCII码 

字符集是所有多字节字符集的一个子集;GB2312字符集是中 

国大陆制定的,容纳了6763个简体汉字;Big5字符集是台湾 

地区制定的,容纳了13053个繁体字;GBK字符集GB2312的 

扩展集。它兼容GB2312,所以也兼容ASCII,它能容纳二万 

多汉字:Unicode字符集设计思想是要它容纳全世界所有文字, 

它是国际通用的字符集。 

代码页就是指一个字符集,其中包含数字、标点符号及 

其他字形。在Windows系列操作系统中,不同的语言和 

locale设置会调用不同的代码页。例如英语和大多数欧洲语 

言使用ANSI代码页1252,而中国大陆和新加坡使用代码页 

936(GBK字符集),中国台湾地区使用代码页950(Big5字 

图1 字符编码转化大全的程序界面 

符集)。程序启动时.自动将多字节代码页设置为操作系统 

默认的代码页。运行库中大多数多字节字符函数的行为,与 

当前多字节代码页设置有关。比如记事本程序(notepad.exe) 

在打开一个ANSI编码的文本时,会根据操作系统的中的设 

置来决定使用哪个代码页。这个设置在控制面板一区域和语 

言选项…高级选项卡~一Language for non—Unicode 

3设计思路 

由于字符编码之间没有对应的规律 如果要把某个文本文 

件从一种字符编码转为由另一种字符编码来存储.一般使用查 

表映射的方式。在Windows系列操作系统中,使用VC++编程 

时,这种字符映射不需要由程序员来编写,可以使用Windows 

操作系统提供的两个函数

WideCharToMultiByte来实现。 

MuhiByteToWideChar、 

programs设置中,如果一个文本原本是用代码页936(简体中 

文)编码的,而操作系统在此处的设置为Chinese(Taiwan), 

函数MultiByteToWideChar可以把多字节字符串转化为宽 

字节字符串,宽字节编码只有Unicode,这是确定无疑的,无 

需特别指出,而多字节编码种类却有很多,使用这个函数可以 

把全部的多字节编码都能分别转化为宽字节编码。它的第一个 

用记事本打开时将会显示乱码,将设置改为Chinese(PRC) 

就可正常显示。由于Unicode是国际通用的宽字节字符集, 

所以用Unicode编码的文本文件不受此处设置的影响,都可 

以正常打开。 

参数是指与多字节字符相关的代码页,它的设置可以是非常具 

2功能及特点 

字符编码转化程序的界面如图1所示。使用这个程序转化 

文本文件的字符编码时,只要在“文件名”前的“编辑浏览控 

体的,如:936(表示简体中文)、950(表示繁体中文)、1361 

(表示韩国语)等;也可以相对的、由操作系统或当前程序所 

处环境决定的,如CP_ACP、CP_OEMCP、CP_rrHREAD—ACP 

等。比如下面函数就可以把简体中文编码的文本转化为 

ll1 6l 与雄 

… 

P矗0BR^啊LANGUAGE… ……“ ……一 ………… …一 r 一…… ………………-n…… … …… ………… 

Unicode编码: 

wchar t GBKToUnicOde(char szAnsi) 

{ 

int wcsLen:::MultiByteToWideChar(936,NULL,szAnsi, 

strlen(szAnsi),NULL,0): 

wchar

_

t wszString=new wchar

_

t[wcsLen+1】 

::MultiByteToWideChar(936,NULL,szAnsi,strlen(szAnsi), 

wszString,wcsLen); 

wszString[wcsLen】_、0 : 

return wszString; 

) 

如果要把繁体中文编码的文本转化为Unicode编码,只要 

把上面代码中的MuhiByteToWideChar函数的第一个参数改为 

950就可以。依次类推。如果要把UTF8编码的文本转化为 

Unicode编码.只要把上面代码中的MultiByteToWideChar函数 

的第一个参数改为CP_UTF8就可以。 

函数WideCharToMultiByte的功能是把宽字节字符串转化 

为多字节字符串,它的第一个参数也是指与多字节字符相关的 

代码贞,用法与MuhiByteToWideChar基本相同。 

4编程实现 

4.1新建项目 

启动Visual Studio 2010,在“文件”菜单上,指向“新 

建”.然后单击“项目”打开“新建项目”对话框。从Visual 

C++项目列表中选择“MFC应用程序”,在“名称”框中键人 

changeCharactorSet”.然后单击“确定”按钮。在“MFC应用 

程序向导”的“应用程序类型”中,选择“基于对话框”,然 

后不停地点击“下一步”。最后点击“完成”即可。本项目的 

字符集要设置为“使用Unicode字符集”。 

4_2在对话框中放置控件 

在对话框中放置如图l所示的各个控件,在表1中,按照 

从左到右,从上到下的顺序对这些控件的类型、ID、标题、相 

关变量、作用等作了具体的介绍。 

表1 各个控件的类型、ID、标题、相关变量、作用 

控件类型 ID 控件标题 相关变量 作用 

静态文本 IDC S I1AⅡC1 文件名: 提示 

编辑浏览 IDC

MF m fileName 指定一个文本文件.将 

控件 CEDITBROWSE1 (CString类型) 转换其字符编码 

Unicode转为 把由Unicode编码的文 

命令按钮 IDC

BUtitON1 

GBK 本转化为由GBK编码 

Unic0de转为 由Unicode转为Big5编 

命令按钮 IDC BUTT0N2 

Big5 码 

命令按钮 IDC

Unicode转为 由Unicode转为UTF8 

BU33"ON3 

UTF8 编码 

GBK转为 由GBK转为Unicode编 

命令按钮 [DC—BUTFON4 

Unicode 码 

偷令按钮 IDC

BuTrON5 

Big5转为 由Big5转为Unicode编 

Unicode 码 

 l

控件类型 ID 控件标题 相关变量 作用 

UTF8转为 由UTF8转为Unicode 

命令按钮 IDC

BUT ̄ON6 

Unicode 编码 

GBK转为 由GBK转为UTF8编 

命令按钮 IDC

BUT ̄ON7 

UTF8 码 

GBK转为 

命令按钮 IDC

BUTrON8 由GBK转为Big5编码 

Bi 

Big5转为 

命令按钮 IDC

BUTYON9 由Big5转为GBK编码 

GBK 

Big5转为 

命令按钮 IDC BU rr0N1O 由Bi【g5转为UTF8编码 

UTF8 

UTF8转为 

命令按钮 IDC

BU'ITONI 1 由UTF8转为Big5编码 

Big5 

UTF8转为 由UTF8转为GBK编 

命令按钮 IDC

BUTI'ON12 

GBK 码 

静态文本 IDC ATIC2 

生成的新文 

件名: 

newFileName 

_

编辑控件 IDC EDIT1 

(CString类型) 

4.3编写用于调用的函数代码 

编写下列7段函数代码: 

(1)函数UnicodeToGBK:功能是把Unicode编码的宽字 

符串转化为GBK编码的多字节字符串: 

char UnicodeToGBK(wchar_t wszString) 

{ 

int ansiLen:::WideCharToMultiByte(936,NULL, 

ring,wcslen(wszString),NULLJ O,NULL,NULL): 

char szAnsi=new char[ansiLen+1】= 

::WideCharToMuItiB ̄e(936,NULL,wszString,wcslen 

lwszString),szAnsi.ansiLen,NULL.NULL): 

szAnsi[ansiLen】=、0 : 

return szAnsi; 

(2)函数UnicodeToBig5;功能是把Unicode编码的宽字节 

符串转化为Big5编码的多字节字符串;只要把函数 

UnicodeToGBK的函数体中所调用的函数WideCharToMultiByte 

的第一个参数由936改为950即可。如下所示: 

char UnicodeToBig5(wchar_t wszString} 

{ 

int ansiLen=::WideCharToMultiByte(950,NULL, 

wszString,wcslen(wszString),NULL,O,NULL,NULL); 

char szAnsi=new char[ansiLen+1】= 

::WideCharToMultiByte(950 NULL,wszString,wcslen 

(wszString),szAnsi,ans en,NULL,NULL); 

szAnsif[ansiLen]= ), =

return szAnsi; 

) 

(3)函数UnicodeToUtt ̄;功能是把Unicode编码的宽字节 

符串转化为UTF8编码的多字节字符串。如下所示: 

wszSt

) 

’ 、 。。 、。 … 一“ 

实用第一 智慧密集 

… … …… … 

char UnicodeToUtf8(wchar_t wszString1 

{ 

int ansiLen=::WideCharToMultiByte(CP—UTF8,NULL, 

wszString,wcslen(wszString),NULL,0,NULL.NULL); 

char SZAnsi=new char[ansiLen 4-1】: 

::WideCharToMultiByte(CP_UTF8,NULL,wszString, 

wcslen(wszString),szAnsi,ansiLen,NULL,NULL); 

szAnsi[ansiLen】=、O : 

return szAnsi; 

) 

(4)函数Big5ToUnicode;功能是把Big5编码的多字节字 

符串转化为Unicode编码的宽字符串。 

wchar

_

t big5ToUnic0de《char szAnsi) 

{ 

int wcsLen=::MultiByteToWideChar(950,NULL szAnsi, 

strlen(szAnsi),NULL,O): 

wchar

_

t wszString=new wchar

_

t[wcsLen+1】: 

::MultiByteToWideChar(950,NULL,szAnsi,strlen(szAnsi), 

wszString,wcsLen); 

wszString[wcsLen1=、0 : 

return wszString; 

) 

(5)函数UTF8ToUnicode:功能是把UTF8编码的多字节 

字符串转化为Unicode编码的宽字符串。只要把函数 

Big5ToUnicode的函数体中所调用的函数MuhiByteToWideChar 

的第一个参数由950改为CP_uTF8即可,如下所示: 

wchar

_

t UTF8TOUnicode(char szAnsi) 

{ 

int wcsLen:::MultiByteToWideChar{CP—U丁F8,NULL, 

szAnsi,strlen(szAnsi),NULL,O): 

wchar

_

t wszString=new wchar t[wcsLen 4-1】: 

::MultiByteToWideChar(CP_UTF8,NULL,szAnsi,strlen 

(szAnsi),wszString,wcsLen); 

wszString[wcsLen】=、0 : 

return wszString; 

) 

(6)函数GBKToUnicode;功能是把GBK编码的多字节字 

符串转化为Unicode编码的宽字符串。 

(7)编写一个函数,用于改变文件名称,它所生成的新文 

件名称是由旧文件名称加上当前时间所组成。 

CString changeFileNamef const CString&oldFileName) 

{ 

time

t t: 

time(&t); 

CString sTime=

_

tctime(&t): 

sTime.Replace《~,,_ ) 

sTime.Replace( : , 一 ) 

sTime=sTime.Mid(4 1 5): 

CString newFileName=oldFileName: 

与辕 l 

newFileName=newFileName Mid(0.newFileName. 

ReverseFind( . )): 

newFileName=newFileName 4-

T( (“)4-sTime 4-—丁 

f“).txt”): 

return newFileName; 

) 

4.4添加各个命令按钮的单击响应消息 

(1)标题为“Unicode转为GBK”命令按钮的单击响应 

消息: 

UpdateData(true): 

CString newFile=changeFileName(mjileName); 

Fl LE stream. out; 

wchar

_

t Iine[8000]; 

char cline; 

out=

_

wfopen(newFile,

丁(“wt )): 

.f((stream=j^,fopen(mjileName,J(¨rb“)))!= 

NULL) 

{ 

while(!feof(stream)) 

{ 

fgetws(1ine,8000,stream) 

cline=UnicOdeToGBK(Iine): 

fputs(cline,out) 

) 

fclose(stream); 

fclose(out); 

) 

newFileName=newFile; 

UpdateData(false); 

(2)标题为“Unicode转为Big5”命令按钮的单击响应消 

息代码与“Unicode转为GBK”的单击响应消息代码基本相 

同.只要把其中所调用的函数UnicodeToGBK改为 

UnicodeToBig5即可。 

(3)标题为“Unicode转为UTF8”命令按钮的单击响应 

消息代码与“Unicode转为GBK”的单击响应消息代码基本相 

同。只要把其中所调用的函数UnicodeToGBK改为 

UnicodeToUtf8即可。 

(4)标题为“GBK转为Unicode”命令按钮的单击响应 

消息: 

UpdateData(true); 

CString newFile=changeFileName(m—fileName); 

FILE*stream, OUt; 

char line[8000]; 

wchar

_

t wline; 

out=

_

wfopen(newFile,—丁( wb“)) :

if((stream:_wfopen(m_fileName,—丁( ))) NULL 

) 

{ 

while{!feof(stream)) 

,  -

PB0BB^M LANGUAGE… …一 … … 一一一 一 一一 … “”一… 一…………… ………………… … 

{ 

fgets(Iine,8000 stream): 

wline=GBK丁oUnicode(1ine): 

fputws(wline,out): 

) 

fclose(stream); 

fclose(out); 

) 

m newFileName=:newFile; 

UDdateData(false): 

(5)标题为“Big5转为Unicode”命令按钮的单击响应 

消息代码与“GBK转为Unicode”的单击响应消息代码基本相 

同.只要把其中所调用的函数GBKToUnicode改为 

Big5ToUnicode即可。 

(6)标题为“UTF8转为Unicode”命令按钮的单击响应 

消息代码与“GBK转为Unicode”的单击响应消息代码基本相 

同.只要把其中所调用的函数GBKToUnicode改为 

UTF8ToUnicode即可 

(7)多字节字符编码之间相互转化时需要以Unicode编 

码作为中介。标题为“GBK转为UTF8”命令按钮的单击响应 

消息: 

UpdateData(true): 

CString newFile:changeFileName(:m一.fileName); 

FILE stream, out; 

char line[8000]; 

char cline; 

wchar

_

t wline; 

out=_wfopen【newFile,

T( wt")): 

jf((stream=_wfopen(m_fileName,—丁(”rt。)))!=NULL 

) 

{ 

while《!feof(stream)) 

{ 

fgets(1ine,8000,stream); 

wline=GBKToUnicode(1ine): 

cline=UnicodeToUtfD【wline): 

fputs(cline,out) 

) 

fclose(stream); 

fclose(out); 

) 

newFileName=newFile; 

UpdateData(fafse); 

(8)标题为“GBK转为Big5”命令按钮的单击响应消息 

代码与“GBK转为UTF8”的单击响应消息代码基本相同, 

只要把其中所调用的函数UnicodeToUtf8改为UnicodeToBig5 

即可。 

(9)标题为“Big5转为GBK”命令按钮的单击响应消息 

代码与“GBK转为UTF8”的单击响应消息代码基本相同,只 

要把其中所调用的函数GBK1rOU,nicode改为BigSToUnicode.把 

UnicodeToUtf8改为UnicodeToGBK即可。 

(10)标题为“Big5转为UTF8”命令按钮的单击响应消 

息代码与“GBK转为UTF8”的单击响应消息代码基本相同. 

只要把其中所调用的函数GBKToUnicode改为Big5ToUnicode 

即可。 

(11)标题为“UTF8转为Big5”命令按钮的单击响应消 

息代码与“GBK转为UTF8”的单击响应消息代码基本相同, 

只要把其中所调用的函数GBKToUnicode改为UTF8ToUnicode. 

把UnicodeToUtf8改为UnicodeToBig5即可。 

(12)标题为“UTF8转为GBK”命令按钮的单击响应消 

息代码与“GBK转为UTF8”的单击响应消息代码基本相同. 

只要把其中所调用的函数GBKToUnicode改为UTF8ToUnicode, 

把UnicodeToUtt ̄改为UnicodeToGBK即可。 

5 结语 

介绍了使用VC++编程实现转换文本文件字符编码的方法。 

可使文本文件的字符编码在Unicode、Big5、UTF8、GBK等编 

码之间实现自由转换。所有代码均在VC++2010下通过测试, 

实验证明该方法简易实用,代码的可移植性很强。经过编码转 

换后的有些文件,使用Windows操作系统中的“记事本”程序 

可能无法正确打开,解决方法是:用鼠标右击该文件.在弹出 

菜单的打开方式中选择Microsoft Office Word,Word程序启动 

后会提示选择“使文档可读的编码”.选择合适的文本编码。 

就能把编码转换后的文件正确打开。 

参考文献 

【1]陈小荷.现代汉语自动分析——Visual C++实现[M】.北 

京:北京语言文化大学出版社,2000. .

[2】D.S.Mahk.C++编程——数据结构与程序设计方法.晏海 

华,等译.北京:电子工业出版社.2003. 

【3]梁水,王家胜.视频学Visual C++.北京:人民邮电出版 

社.2009. 

(收稿日期:2012-.02-.-29) 

脑螭 


本文标签: 编码 代码 字节 字符