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
生成的新文
件名:
m
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);
)
m
—
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);
)
m
—
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)
脑螭
版权声明:本文标题:用VC++编程实现转换文本文件的字符编码 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1710218895a563021.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论