• VS2017新建windows控制台程序打印中文乱码问题


    最近刚换上VS2017,由于手头又要做个MFC的程序,所以写控制台程序做功能测试,然后发现居然乱码了。

    于是用VS2017新建windows控制台应用程序,在main函数种加一句printf("你好");后,运行结果依然乱码

    用notapad++打开该文件后,点击菜单栏的编码一项,发现是UTF-8无BOM格式编码,然后改成以ANSI格式编码后

    也就是说VS是用UTF-8来编码代码文件的,编译出的程序中字符串也是按照UTF-8编码的,而控制台却是按照ANSI编码来理解的。

    打个比方,A用0x00代表“是”,B用0x00代表“否”,A发送0x00给B,然后B显示的是“否”。

    那么先说解决方案吧,也就是让VS对文件用ANSI编码就行了,在网上搜索了一番后很轻松地找到了解决方案

    VS菜单项的工具-->自定义,打开“自定义”对话框,然后选中“命令”选项卡,点击“添加命令”按钮

    然后在[文件]种找到[高级保存选项],点确定,可以发现VS菜单栏多了高级保存选项一栏,只要光标在代码文件种,就可以点击该菜单项。

    把编码改成简体中文(GB2312),然后重新编译运行,显示就正确了。

    在cmd窗口种输入chcp命令也可以看到,windows命令行窗口的活动代码页是936。

    当然,我把修改前的文件Project2.cpp和修改后的文件Project1.cpp导入进了Linux系统里,用locale命令可以看到系统默认是以UTF-8编码

    $ locale
    LANG=en_US.UTF-8
    LANGUAGE=en_US
    LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
    LC_ALL=

    用file命令可以看到

    $ file Project1.cpp 
    Project1.cpp: C source, ISO-8859 text, with CRLF line terminators
    $ file Project2.cpp 
    Project2.cpp: C source, UTF-8 Unicode text, with CRLF line terminators

    一个是ISO-8859,一个是UTF-8,现在UTF-8是大势所趋,像MFC的字符串类CString早在十年前的VS就是CStringW了(即MFC项目种默认编码是UTF-8),只是在之前的VS版本种,控制台程序的编码还是适应命令行窗口的。

    另外注意,后半句,line terminators(换行符)是CRLF。再回到刚才的高级保存选项对话框

    在windows中换行符是" ",而Unix系(包括Linux)的换行符是" ",VS2017为了支持其他系统,在高级保存选项中可以设置编码来进行兼容。

  • 相关阅读:
    Flink基于EventTime和WaterMark处理乱序事件和晚到的数据
    flink 有什么优点
    Flink-Kafka 连接器及exactly-once 语义保证
    腾讯大学
    Qt 获取文件路径、文件名、后缀
    Qt QDir::currentPath()和QAppllication::appllicationDirPath()用法区别
    Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法
    Qt comboBox设置下拉菜单()
    Qt 快速读写Excel指南
    可见光的波长与频率对照表
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/7487745.html
Copyright © 2020-2023  润新知