zoukankan      html  css  js  c++  java
  • code::blocks 初使用遇到的问题记录

    /*  做本程序遇到的问题:由于使用的是CODE::BLOCKS 开发环境,刚开始使用code::blocks是,什么都
    没有设置,居然输入的中文字符串,保存项目后,再次打开,code::blocks不能正确识别源文件编码,没能识别
    成:936中文代码页,而是 10** 什么的,打开后中文区域就是乱码. 后来找到设置,发现是没有强制指定用户
    需要的代码页所致,后来设置为强制就OK了,{不过,把源文件改成UTF8,来保存也是可以的(因为编辑器默认是UTF-8来打开),但是COUT<<"中华人民共和国"}
    这样的中文字符串时,控制台输出为乱码(编译器又带来了编码不匹配),因为控制台默认不支持UTF8,或codeblock本地化做的不好的缘故,按道理
    可以改控制台为chcp 65001是可以看到中文的,但codeblocks看不到.
    只有指定编译参数:-fexec-charset=GBK
    -finput-charset=UTF-8
    这样就可以强制输出的exe为GBK运行编码而不是UTF运行编码了.就可以正确显示中文了,
    如果还要搞Wchar_t的UNICODE 还需要setlocal(lc_all,"chs"),并且要么源文件是UTF-8,要么-finput-charset设置为GBK,否则编译期就要报错.........
    //////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    
    网上查到的关于codeblocks编译器,编码的问题解释:
    
    1.Code::Blocks 编辑器保存源文件用的编码。
       默认情况下,是保存为windows本地编码的,也就是WINDOWS-936字符集,也就是GBK编码。
      但是很神奇的是,GCC编译器默认编译的时候是按照UTF-8解析的。你存成GBK,但是当成UTF-8解析,这还能编译通过,这才有鬼了,所以这两个地方编码不统一好,编译的时候报错:error: converting to execution character set: Illegal byte sequence,你根本连通过编译的可能性都没有!
    其实要解决这个问题很简单,编写Code::Blocks的人只需要在调用编译器之前检测一下源文件是什么编码,然后就自动让编译器用什么编码进行解释,问题就解决了。只是很可惜,Code::Blocks编写的人可能还没有这么做,或许是对本地化认识不够吧,也可能是觉得没必要吧?(所以就给初学的人带来问题了,所以就觉得易用性不如微软了,免费和商业的东西还是有差距的。。。)
    
    2。GCC编译器编译的时候对输入的源文件解释用的编码
    这个编译器可以设置-finput-charset=charset来指定编译器用什么编码解释输入源文件。比如如果源文件的字符集是GBk,那么就必须指定-finput-charset=GBK,如果不指定,一律当做UTF-8处理。
    除非你源文件真的是UTF-8,否则就会出现转换错误。
    
    3。编译好的执行文件所用编码
      如果你1和2两个地方的编码都能统一,那么编译时不会报错了,但是编译好了,运行一下看看,在控制台显示的依然是乱码!
     那是因为控制台显示的时候缺省的是使用系统默认的字符集,比如windows下用的是GBk,但是默认情况下,编译之后的执行文件时编译成UTF-8的,所以又出现了不统一,乱码由此而生!
    解决的方法和简单,就是给编译器加上选项:-fexec-charset=GBK,和windows默认的统一,就OK了。
    
    搞懂了乱码产生的原因,那么不难得出结论,如何修改,你想修改成什么都OK,关键是要统一,并不是像网上一些人说的,修改成GBK就OK,其实你要修改成UTF-8都OK,关键是统一。
    
    */
    #include <stdio.h>
    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    ///////////////////////////////////////////////////////////////////////////////
    //最简单的类模版
    template <class M>
    class A
    {
        M ta;
    public:
        A(M x):ta(x)  //这里很有特点,可以在构造函数的初始化表中初始化本类的成员变量.
        {
            ta=x;  //用这种方法也是一样的,但可以认为不是初始化,而是赋值.
            //区别是:任何类型的const和引用数据成员必须在初始化表中初始化,
            //如果在构造函数内部进行初始化就会产生编译时刻错误.
        }
    
        void print();
    };
    
    template <class M>
    void A<M>::print()
    {
        cout<<ta<<endl;
    }
    ///////////////////////////////////////////////////////////////////////////////////
    
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////
    //测试普通类也是可以通过构造函数初始化表中初始化类成员变量.
    class test
    {
    private:
        int a,b;
    public:
        test(int x):a(x),b(x)
        {
           a=60;
           b=60;
        };
    
        void pr();
    
    };
    
    void test::pr()
    {
        cout<<a<<"  "<<b<<"  "<<endl;
    }
    
    
    //////////////////////////////////////////////////////////////////////////////////////
    
    
    
    int main()
    {
    
       setlocale(LC_ALL,"chs");
    
       wchar_t a=L'';
    
        //printf("%d",(WORD)a);
        //printf("%d",HIBYTE(a));
        //printf("%d",LOBYTE(a));
    
    
           //wchar_t a=L'陈';
        //printf("%d
    ",(WORD)a);
        //printf("%d
    ",HIBYTE(a));
        //printf("%d
    ",LOBYTE(a));
    
        char * b = "陈佑忠";
        cout<<b<<endl;
        MessageBoxA(0,b,b,0);
        wcout<<a<<endl;
    
    
        int m(',');
        cout<<m<<endl;
    
        test t(50);
        t.pr();
    
    
        A<float> ok(58.226);
        ok.print();
    
       return 0;
    }
  • 相关阅读:
    PythonStudy——greenlet 协程
    PythonStudy——事件 Event
    PythonStudy——单线程并发的实现
    2015年的总结
    kylin一种OLAP的实现
    分布式消息队列的使用kakfa
    第一次听到了docker
    Hive分布式的数据仓库
    dubbo服务框架学习
    Storm实时计算框架的编程模式
  • 原文地址:https://www.cnblogs.com/webcyz/p/3500258.html
Copyright © 2011-2022 走看看