使Sublime Text3 在C/C++支持中文文件名和中文目录
浏览 2846 | 评论 2 | 字数 2611
卖女孩的小火柴
2019年07月07日

Sublime Text3对中文处理的一向不好,主要归功于微软的系统GBK编码,使得g++/gcc的调试信息都是GBK编码的,在Sublime Text3的终端看来就是一团乱码。

该如何处理这个问题?

  • 首先,你需要升级到最新的ST3,以避免一些已知的BUG。
  • 其次,你需要将toutf8.exe这个文件放入MinGW的bin目录(MinGWbin)当中
  • 然后,修改您的Sublime Text3的编译系统,修改shell命令中的g++为toutf8 g++ 或者 gcc 为 toutf8
    gcc 如:toutf8 g++ -Wall -std=c++0x -Wshadow -Wunreachable-code -fexec-charset=GBK "$file\" -o \"$file_base_name"
  • 最后,enjoy~~

您可以在文章的最后下载toutf8.exe
或者点此下载toutf8.7z

toutf8.exe的原理是?

  • 获取传入的参数,然后使用shell执行传入的命令并将输出重定向到temp目录
  • 按行获取返回文本,如果匹配到C:或者D:等等则进行转换(从GBK到UTF-8)
  • 输出所有返回

下面是toutf8.exe文件的源码

    #include <stdio.h>   //popen()
    #include <string.h>  //memset()
    #include <stdlib.h>
    #include <windows.h>
    
    int GBK2UTF8(char *szGbk,char *szUtf8,int Len)
    {
        // 先将多字节GBK(CP_ACP或ANSI)转换成宽字符UTF-16
        // 得到转换后,所需要的内存字符数
        int n = MultiByteToWideChar(CP_ACP,0,szGbk,-1,NULL,0);
        // 字符数乘以 sizeof(WCHAR) 得到字节数
        WCHAR test[sizeof(WCHAR) * n];
        WCHAR *str1 = test;
        // 转换
        MultiByteToWideChar(CP_ACP,// MultiByte的代码页Code Page
            0,            //附加标志,与音标有关
            szGbk,        // 输入的GBK字符串
            -1,         // 输入字符串长度,-1表示由函数内部计算
            str1,         // 输出
            n             // 输出所需分配的内存
            );
    
        // 再将宽字符(UTF-16)转换多字节(UTF-8)
        n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
        if (n > Len)
        {
            return -1;
        }
        WideCharToMultiByte(CP_UTF8, 0, str1, -1, szUtf8, n, NULL, NULL);
        str1 = NULL;
        return 0;
    }
    
    int main(int argc, char **argv)
    {
        char canshu[1000];
        canshu[0]=0;
        for (int i = 1; i < argc; ++i)
        {
            strcat(canshu,argv[i]);
            strcat(canshu," ");
        }
        strcat(canshu,">%tmp%\\output.txt 2>&1");
        int fanhui = system(canshu);
        //取出执行结果
        FILE *fp;
        //获取临时目录
        char OutPath[100];
        GetTempPath(100, OutPath);
        strcat(OutPath,"\\output.txt");
        fp=fopen(OutPath,"r");
        char ch;
        char hang[1000];
        int i = 0;
        while((ch=fgetc(fp))!=EOF)
        {
            hang[i++]=ch;
            if (ch=='\n')
            {
                //一行结束,开始处理
                hang[i++]=0;//赋上结束符
                if (hang[1]==':' && hang[2]=='\\')
                {
                    //这一行需要进行处理
                    GBK2UTF8(hang,canshu,1000);
                    printf("%s", canshu);
                }else
                {
                    //直接输出
                    printf("%s",hang);
                }
                i = 0;
            }
        }
        fclose(fp);
        return fanhui;
    }

toutf8.7z

本文作者:卖女孩的小火柴
本文链接:https://www.shinenet.cn/archives/16.html
最后修改时间:2019-11-15 19:57:20
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
如果文章对您有帮助,不妨打赏杯可乐?微信-赞赏码
评论
如果可能,请填写真实邮箱,有回复会送至邮箱。请不要水评论,谢谢。
textsms
支持 Markdown 语法
email
link
评论列表
已有 2 条评论
Quasimodi
2019-08-14 23:01
可以可以
七云
2019-07-09 04:31
不错撒