紧急求救:ANSI编码文件,英文,出现乱码,除去之

辉歌 2010-07-28 05:42:36
我有一个工程,是芬兰语系,文件保存为芬兰语格式,不过内容是英文。
我正在用doxygen生成文档,指定输入编码为GBK,因为我用了中文做注释。
doxygen发现有些文件用GBK无法认识,我找了找,发现如下行:

// Index 0 = Marginaalit p滗ll?pois
// Index 1 = Resurssirekisteriraportin ryhmittelytila (RES/LAJI/RYHMA)

将其中的类似中文字删除,doxygen就不报错了。
可是这个项目有很多文件,一个一个手工修改,太麻烦了。不知道有无办法解决下。


ar >> mbCalculator; // number from field open calculator
ar >> miRealizedLinesegmentFormat; // Realization-jana tulostetaan (0=Duration, 1=m滗r? 2=tunnit...)
ar >> mbToolTips; // Ty鰇alurivin tooltipit

基本上出现在注释中。
...全文
142 点赞 收藏 11
写回复
11 条回复
辉歌 2010年07月29日
谢谢各位热情的回复。特别是icansaymyabc,很有耐心。我长进了很多。谢谢。
对这块研究不多,所以理解不深刻。
我尝试了方案如下:
cattycat的方案,因为输出还是有不识别的文字:// Index 0 = Marginaalit pll?pois,其中的?即为不识别的。当然,这是我的经验。所以我没有实际操作。

4楼的回复:
芬兰语是Latin-1编码吧,中文是GBK,这两种编码都是使用0x80~0xFF的扩展ASCII作为码位,有重码,因此无法共存,只能全改UNICODE。现在知道Unicode的那个唯一码的含义了么?

你的乱码显示为汉字的冷僻字,说明芬兰语字母跟GBK汉字编码冲撞了。

你用记事本随便打开一个exe文件,乱码中有大量汉字,不是因为exe文件有汉字,而是恰好撞上了汉字编码。
----
实际操作如下:
用VC2005以Latin-9编码打开,以GBK936存储,在保存的时候,提示有冲突,选择no。结果OK。不过这要人工一个一个文件的搞。搞了一晚上,累死我了。
所以想自己编程。
-------------------
采用7楼的:
你可以写个程序,按照ASCII编码把文件读出来,然后把每个ASCII字符转换为unicode的字符,再保持成unicode文件就好了吧.

用MultiByteToWideChar,先从Latin-9转换成UNICODE,然后用WideCharToMultiByte转换成936。
结果转换后的文字,最后总是多了一截文字。因为太晚了,困,放弃。

-----------------
后看doxygen,用的是iconv库,遂搜索iconv for windows,下载到1.92版本。批处理处理之:

查看了下vcproj文件,发现编码是windows-1252,所以不打算采用latin编码读入了。
批处理文件1,f2gbk.bat
@echo off
echo 将%1从windows-1252编码转换到gbk编码
for %%f in (%1) do copy %%f %%f.1252
for %%f in (%1) do iconv -c -f windows-1252 -t gbk %%f.1252 > %%f

这批处理也是从网上搜索到的。

批处理之二:travel.bat
set path=%path%;"I:\opensource\tools\libiconv-1.9.2-1-bin\bin\"
setlocal EnableDelayedEx
for /f "delims=" %%i in ('dir /b /a-d /s *.cpp *.h') do call f2gbk %%i
endlocal

运行travel .
万事大吉,doxygen顺利工作。


回复 点赞
赵4老师 2010年07月29日
//GBK汉字内码范围
//区码 ,位码
//81-A0 ,40-7E 80-FE
//AA-AF ,40-7E 80-A0
//B0-D6 ,40-7E 80-FE
//D7 ,40-7E 80-F9
//D8-F7 ,40-7E 80-FE
//F8-FE ,40-7E 80-A0
回复 点赞
icansaymyabc 2010年07月29日
[Quote=引用 8 楼 w8u 的回复:]
我在寻找一个工具,能批处理的修改文件的code page。将芬兰语的code page修改成GBK的code page
[/Quote]
4楼已经给了正解,你怎么还不懂还要说这种话呢?

看来要给你举个例子你才懂了。

把 ASCII 编码看作是美国人;
Latin-1编码(芬兰语)看作是日本人;
GBK编码看作是韩国人。

你从照片上能轻易区分美国人和日本人,但你无法区分日本人和韩国人。

现在的问题是,你把 美国人、日本人、韩国人的照片杂乱装在同一个盒子里,然后在盒子外面贴上“日本人”这个标签。结果出错了,因为里面有韩国人,用日语打电话给这些韩国人他们听不懂。

4楼已经把这个原因给你说明白了。你还要固执地去找一个工具想把盒子上的标签改成“韩国人”认为这样就解决问题了。其实不然,因为里面有日本人,你给那些日本人用韩语打电话过去它们同样听不懂。

4楼的意思是,惟有用2楼的程序先把盒子里的日韩人照片统统扔掉。把文件转成UNICODE编码,然后再根据需要把日韩人的照片加进去。UNICODE编码和ANSI编码不同,它相当于在美国人脑门上加印星条旗,在日本人脑门上加印太阳旗、在韩国人脑门上加印太极旗,这样不需要通过 外貌+全局定义的国籍 来识别不同国人,无论如何不会弄错了。


这样说你是不是明白一点了?
回复 点赞
辉歌 2010年07月28日
我在寻找一个工具,能批处理的修改文件的code page。将芬兰语的code page修改成GBK的code page
回复 点赞
yongziqd 2010年07月28日
你可以写个程序,按照ASCII编码把文件读出来,然后把每个ASCII字符转换为unicode的字符,再保持成unicode文件就好了吧.
回复 点赞
jackyjkchen 2010年07月28日
如果你能够保证程序字符串中没有芬兰语,可以用2楼的代码消除注释的大于0x80的字符。
回复 点赞
CyberLogix 2010年07月28日
自己写个程序做个批处理
回复 点赞
jackyjkchen 2010年07月28日
芬兰语是Latin-1编码吧,中文是GBK,这两种编码都是使用0x80~0xFF的扩展ASCII作为码位,有重码,因此无法共存,只能全改UNICODE。现在知道Unicode的那个唯一码的含义了么?

你的乱码显示为汉字的冷僻字,说明芬兰语字母跟GBK汉字编码冲撞了。

你用记事本随便打开一个exe文件,乱码中有大量汉字,不是因为exe文件有汉字,而是恰好撞上了汉字编码。
回复 点赞
cattycat 2010年07月28日

a.txt

// Index 0 = Marginaalit p滗ll?pois
// Index 1 = Resurssirekisteriraportin ryhmittelytila (RES/LAJI/RYHMA)

ar >> mbCalculator; // number from field open calculator
ar >> miRealizedLinesegmentFormat; // Realization-jana tulostetaan (0=Duration, 1=m滗r? 2=tunnit...)
ar >> mbToolTips; // Ty鰇alurivin tooltipit

执行完后,b.txt
// Index 0 = Marginaalit pll?pois
// Index 1 = Resurssirekisteriraportin ryhmittelytila (RES/LAJI/RYHMA)

ar >> mbCalculator; // number from field open calculator
ar >> miRealizedLinesegmentFormat; // Realization-jana tulostetaan (0=Duration, 1=mr? 2=tunnit...)
ar >> mbToolTips; // Tyalurivin tooltipit

回复 点赞
cattycat 2010年07月28日
自己写个文件,读文件的每一行,删除其中的类似中文的字符。
#include <stdio.h>
#include <string.h>

void strdel(char *p)
{
int i,j;
for(i=0,j=0;i<strlen(p);i++)
{
if((unsigned)p[i]<0x80)
{
char c=p[i];
p[j++]=c;
}
else
++i;
}
p[j]='\0';
}
int main()
{
FILE*fp,*fp1;
char buf[128];

fp=fopen("a.txt","r");
fp1=fopen("b.txt","w");
while(!feof(fp))
{
fgets(buf,128,fp);
strdel(buf);
fprintf(fp1,"%s",buf);
}
fclose(fp);
fclose(fp1);
}
回复 点赞
ayw215 2010年07月28日
把代码的文件都改成Unicode的呢?
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告