Source Insight完美转换UTF-8 到 GB2312

Source Insight完美转换UTF-8 GB2312

/蒹葭

前言

很多人用source insight 打开某些源码文件时,汉字显示为一堆乱码。这个问题是因为编码方式不同。记事本和一些编辑器默认编码方式是ANSI,在这种方式下输入汉字,其实就是GB系列的编码方式。不幸的是,广收欢迎的代码查看工具Source insight 虽然支持汉字,但是它不支持UTF-8。笔者感到疑惑的是,当初开发source insight的这帮人现在哪里去了?为何不继续开发?这么好的工具,却不再更新了,实在让人可惜。

可惜归可惜,程序还是要看。乱码怎么办?很多人用笨方法,用记事本打开源代码,再另存为ANSI格式的文件。如果文件只有几个,倒是既简单又实惠,然而,当你碰到成百上千的代码文件都是UTF-8时,你就会觉得这是梦魇了。

不过,不要怕。现在,完美的解决方法来了。(貌似跟做广告一样)

概述

本程序是参考网上源代码修改而成。感谢原作者将该代码开源,我的工作只需在他的基础上进行修改就可以了,省去了大量的工作,使得我花了一个下午的时间就改成我所想要的程序。这就是开源的好处。所以说开源能帮助人们更快的开发出更好的软件,开源万岁。希望看到本文的读者,也能为开源事业贡献自己的一份力量。虽然说,此类代码到处都有,不足为奇,但这个代码在我改进之后,还是具有一些优点:

l         命令行执行  改进前的程序只能单独执行,根据提示输入参数和要转换的目录或文件;改进后的程序可集成到编辑器,集成开发环境(IDE)。下文将会介绍如何集成到source insight中。

l         智能识别编码方式  原来的程序不能识别编码方式。如果转换时选择了一个非UTF-8编码的文件,转换后就成了乱码;改进后的程序能智能识别编码方式,无论是UTF-8文件是BOM格式还是非BOM格式,都能识别。对于纯ASCII码的文件,也能识别。

l         支持批处理  改进前的程序有bug,对目录支持不完善;改进后的程序能很好的支持批处理。

 

目前,这个程序只针对源代码文件编写,支持后缀名为 .c .cpp .cxx .h .xml .java .txt等文件。如确实有需要,今后将支持更多类型的文件编码格式转换。

 

如何集成到 source insight?

下面,先介绍如何集成到 source insight里。本人使用的汉化版,如英文版请对照执行。

文件转换命令    该命令能将当前打开的文件进行编码转换。很简单,步骤如下:

source insight里,选择 “选项”“自定义命令”,弹出对话框后,点击“添加”,输入新命令名 CodeConvert File 。确定后,点击“浏览”,选择我们的codeConvert.exe程序路径。在输入框里加上参数” –u2g %f” (注意空格,双引号不要)。

这样,这个文件转换命令就添加成功。打开某个文件,按照上面步骤,选择该自定义命令点击“运行”,即可进行转换。

目录转换命令    该命令能将当前打开的文件所在的文件夹进行编码转换。步骤同上,只是在输入框里的参数改为” –u2g %d” (注意空格,双引号不要)。

怎么样?在source insight里点几下,就能转换了。混沌世界一下子清晰了。

主要源码部分

这是检测文件是否是UTF-8格式的函数,其他部分不再一一列出,请参考源代码。

/*!  detect if the fiel is UTF-8 code

/param LPCTSTR filename

/return true/false

*/

bool detect_utf8file(LPCTSTR filename)

{

       const unsigned char BOM[3] = {0xEF,0xBB,0xBF};

       int count_good_utf = 0;

       int count_bad_utf = 0;

       int begin = 0;

       char buf[3]={0,};

       CStdioFile file_r ;

       if(!file_r.Open((char*)(LPCTSTR)filename, CStdioFile::modeReadWrite))

              return false;

 

       file_r.Read(buf,3);

       if(!strncmp(buf,(char *)BOM,3)) {

              std::cout<<"this is utf(BOM). "<<endl;

              file_r.Close();

              return true;

       }

       else {    // detect the whole file

       //     UTF-8 text encoding auto-detection

       //     count the following pairs of consecutive bytes as shown in the table:

       //     11..  10..  good

       //     00..  10..  bad

       //     10..  10..  don't care

       //     11..  00..  bad

       //     11..  11..  bad

       //     00..  00..  don't care

       //     10..  00..  don't care

       //     00..  11..  don't care

       //     10..  11..  don't care

              char current_byte,previous_byte;

              file_r.SeekToBegin();

              file_r.Read(&current_byte,1);

              previous_byte = current_byte;

              while(file_r.Read(&current_byte,1)) {

                     if ((current_byte & 0xC0) == 0x80) {

                            if ((previous_byte & 0xC0) == 0xC0) {

                                   count_good_utf ++;

                            } else if ((previous_byte & 0x80) == 0x00) {

                                   count_bad_utf ++;

                            }

                     } else if ((previous_byte & 0xC0) == 0xC0 ){

                            count_bad_utf ++;

                     }

                     previous_byte = current_byte;

              }

              //     the comparison ">=" handles pure ASCII files as UTF-8,

              //     replace it with ">" to change that

 

              if(count_good_utf > count_bad_utf) {

                     file_r.Close();

                     std::cout<<"the code of this file is utf(no BOM). "<<endl;

                     return true;

              } else if(count_good_utf == count_bad_utf) {

                     file_r.Close();

                     std::cout<<"the code of this file is pure ASCII file as UTF-8. "<<endl;      

                     return true;

              }

              else {

                     file_r.Close();

                     std::cout<<"the code of this file is not utf. "<<endl;

                     return false;   

              }

       }

      

}

 

程序虽然能运行,但是我相信还有bug,还可以完善。本人知识有限,如有不当之处还请多多指正,大家共同进步。源代码在http://download.csdn.net/source/1741768 ,好像CSDN只能在那里上传代码。

 

 

  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
sourceinsight40114-setup 是 SourceInsight 软件的一个安装程序。SourceInsight 是一款专业的源代码阅读和分析工具,主要用于开发人员在软件项目中查看、编辑和理解源代码。 sourceinsight40114-setup 是该软件的一个特定版本的安装文件。它包含 SourceInsight 4.0.114 版本的所有必要组件和文件,可以通过运行这个安装程序将该版本的 SourceInsight 软件成功地安装到计算机中。 安装 SourceInsight 的步骤通常很简单。首先,双击运行 sourceinsight40114-setup 安装程序,然后按照安装向导的指示逐步进行安装。安装过程中需要选择安装路径,并可以选择是否创建桌面快捷方式和启动菜单项等。完成安装后,可以通过桌面快捷方式或者启动菜单中的图标来打开 SourceInsight 软件。 安装 SourceInsight 后,用户可以在其界面中打开源代码文件进行阅读和编辑。SourceInsight 提供了丰富的功能,如代码导航、代码分析、符号查询、变量跟踪、代码片段注释等,方便开发人员更好地理解和修改代码。此外,SourceInsight 还支持多种编程语言,如C、C++、C#、Java 等,可以满足不同项目的需求。 总之,sourceinsight40114-setup 是 SourceInsight 软件特定版本的安装程序,通过运行它可以将 SourceInsight 4.0.114 版本的软件成功地安装到计算机中,开发人员可以使用它来阅读、编辑和分析源代码,提高代码开发和维护的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值