Source Insight完美转换UTF-8 到 GB2312

前言

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

可惜归可惜,程序还是要看。乱码怎么办?用记事本打开源代码逐个转换的笨方法虽然简单,但当遇到大量UTF-8编码的文件时就繁琐了。这里介绍一种批处理方法。

概述

本程序是参考网上源代码修改而成。感谢原作者将该代码开源,我只花了一个下午就改成所想要的程序。能帮助人们更快的开发出更好的软件,开源万岁。希望读者也能为开源事业贡献自己的一份力量。改进后的程序有一些优点:

l 命令行执行

可以命令行执行或由bat调用,也可集成到编辑器如SourceInsight中。

l 智能识别编码方式

自动识别 UTF-8(BOM格式、非BOM格式)、纯ASCII码文件,决定是否需要转换。

目前,这个程序只针对源代码文件编写,支持后缀名为 .c .cpp .cxx .h .xml .java
.txt等文件。同理支持其它后缀的文件转换。

如何集成到 source insight?

下面,先介绍如何集成到 source insight里。

转换文件

在source insight里,选择 “选项”→“自定义命令”→“添加”,输入新命令名 CodeConvert
File 。确定后,点击“浏览”,选择我们的codeConvert.exe程序路径。在输入框里加上参数” -u2g
%f” (注意空格,双引号不要. %f的含义见SI的帮助文档“Command Line Substitutions”小节)。

这样,这个文件转换命令就添加成功。打开某个文件,按照上面步骤,选择该自定义命令点击“运行”,即可将当前打开的文件进行 UTF-8到GB2312编码转换。

转换目录

若转换的对象是目录(及子目录)则只需将 %f 换成 %d 即可。

主要源码部分

这是检测文件是否是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;
}
}
}

Reference:

http://blog.chinaunix.net/uid-24118190-id-1759447.html

Source Insight完美转换UTF-8 到 GB2312

时间: 2024-10-20 13:27:29

Source Insight完美转换UTF-8 到 GB2312的相关文章

让Source Insight完美支持中文注释 (转)

如何让source insight支持中文注释,解决回车删除,移动光标出现乱码的问题?下面是解决方案: -------Source Insight3 中文操作(左右键.删除和后退键)支持宏------- 感谢丁兆杰([email protected])及互联网上辛勤耕耘的朋友们!!! Evan: [email protected] ① Project→Open Project,打开Base项目,将文中代码框中的所有内容函数复制到utils.em文件的最后: ② 重启SourceInsight:

Source Insight 中文乱码问题

转自: http://blog.csdn.net/ccf19881030/article/details/8987759 最近使用source insight查看一些开源代码,显示中文就乱码,据说是因为source insight不支持utf-8编码,默认编码方式为ANSI码.所以需要将utf-8等非ANSI码的文件转换成source insight默认支持的ANSI码格式才能显示中文不乱码.    解决方案如下: 一.单个文件转换 对于单个文件,好说,只要将非ANSI码格式的文件转换成ANSI

source insight中文注释乱码问题的解决方案

SI的使用技巧:在我的搜集的文档里有一篇专门写的,可以看 最近使用source insight查看一些开源代码,显示中文就乱码,据说是因为source insight不支持utf-8编码,默认编码方式为ANSI码.所以需要将utf-8等非ANSI码的文件转换成source insight默认支持的ANSI码格式才能显示中文不乱码.    解决方案如下: 一.单个文件转换 对于单个文件,好说,只要将非ANSI码格式的文件转换成ANSI码格式即可,方法如下:1.将文件用ultraEdit32打开,选

Source Insight 中文注释为乱码解决办法(完美解决,一键搞定)【转】

转自:http://blog.csdn.net/bjarnecpp/article/details/70174752 版权声明:本文为博主原创文章,未经博主允许不得转载. Source Insight中文注释为乱码解决办法 我网上查了一堆解决办法,但是都是2017年以前的,并且都是针对于source insight 3.5及以下版本的解决方案,软件版本都到4.0了,应该有新方法出现. —————————————————————————————————————— 干货:Source Insight

Source Insight 添加代码排版和编码转换

Source Insight 提供了宏实现和命令实现. 命令实现: 1.代码排版 需要借助indent工具.可以下载GnuWin32,可以安装大多数Linux命令. indent排版很简单. 添加命令:indent.exe  -npro -nip -nlp -npsl -i4 -ts4 -sob -l80 -ss -bl -bli 0 %f %f代表当前文件. Souce Insight可以给命令添加菜单和快捷键. 2.编码转换 需要借助iconv工具.可以下载libiconv工具. iconv

【转】Source Insight中文注释为乱码的解决办法

我网上查了一堆解决办法,但是都是2017年以前的,并且都是针对于source insight 3.5及以下版本的解决方案,软件版本都到4.0了,应该有新方法出现. 干货:Source Insight 4 的解决办法(source insight 3.5 及以下版本就到其他地方看看吧) [解决办法]: 单个文件乱码解决办法: 菜单栏中[File] > [Reload As Encoding...] > [Chinese Simplified (GB18030)] > 选择后,点击load,

ubuntu14.04中 gedit 注释能显示中文,而source insight中显示为乱码的解决办法

1.乱码显示情况: 2.用gedit打开文件,并用ctrl+shift+s(另存为),其中charactor coding选为chinese simplified(GB2312); 2.修改个文件名, 并点击save. 3.用source insight打开,看看是不是不是乱码了? - - 4.这个我可搞了好几天,嘿嘿~~~

source insight 笔记

一.建立工程.界面介绍 打开Source Insight,选择Project 菜单->New Project: 在出现的对话框中选择并选择存放工程文件的文件夹,输入工程名(比如McuSystem),点击"保存": 又出现一个对话框,在 Configuration 部分可以选择这个工程使用全局配置文件还是自己单独的配置文件,这个无所谓,(不过最好选择单独的配置文件),再点击"OK": 再次出现一个对话框,这是选择文件添加到 Project 中,通过左边的树状图找

source insight实用配置

1.设置字体大小options-document options ,找到screen fonts,即可打开下面的界面设置全文字体大小 2.往里添加中文注释时,字间距很大.解决方法如下: 1.Options->Style Properties 2.左边Style Name下找到Comment Multi Line.Comment.Comment Right.Comment Single Line.在右边对应的Font属性框下的Font Name中选"Pick..." 设置为宋体.常