TomZz 发表于 2022-8-2 23:42:37

关于mingw-w64报错下的中文处理

本帖最后由 TomZz 于 2022-8-3 00:47 编辑

使用mingw-w64作为编译器。
Windows下以以下代码运行:
chcp 65001 > null ; if ($?) { cd "c:\Users\Administrator\Desktop\数据结构\1.基本概念\" } ; if ($?) { gcc 例3.c -o 例3 } ; if ($?) { .\例3 }
即将控制台改为UTF-8了,正常输出和输入中文。
可是当我故意写一段错误代码
printf("试试中文") 中;
报出了三个错误
��3.c: In function 'main':
��3.c:37:26: error: stray '\344' in program
   printf("�01;31m中;
                        ^
��3.c:37:27: error: stray '\270' in program
   printf("�01;31m��;
                           ^
��3.c:37:28: error: stray '\255' in program
   printf("�01;31m�;
可以看到到报错的情况下中文文件名和中文代码部分仍是乱码。
文件名是"例3.c",估计是“例”这个字占用两字节被强制拆分成两个一字节的字处理。
有大佬可以解读一下Gcc的报错机制是强制ascii码吗?
附上截图

mblock 发表于 2022-8-3 13:52:03

实测中文文件名并不会乱码,但是不建议使用中文文件名,因为 gdb貌似并不支持中文路径。

https://s3.bmp.ovh/imgs/2022/08/03/20d8b0b186dd67b9.png

mblock 发表于 2022-8-3 14:04:58

本帖最后由 mblock 于 2022-8-3 14:11 编辑

mblock 发表于 2022-8-3 13:52
实测中文文件名并不会乱码,但是不建议使用中文文件名,因为 gdb貌似并不支持中文路径。

文件名貌似不论如何都是用gbk编码的,但是文件报错的部分,是用的文件编码,如果源码采用gbk,则没有这个问题。

我的建议是不要改chcp,这东西会导致输入输出流采用不同的编码,如果你chcp 65001了,输出虽然是utf-8但是,输入流仍然是gbk。

最简单的解决方法应该就是全用 gbk了(源码也是用gbk编码)
https://i.bmp.ovh/imgs/2022/08/03/1680e9e0909a0d72.png
没有问题

如果源码执意要用 utf-8 可以在编译选项里加一个 -fexec-charset=GBK 让输出的文件是GBK编码的。
也不会有什么问题,当然就是报错的时候有乱码,但是我平时用vscode写,也不去看他怎么报错的,定位到多少行和错误描述就行。

你可以找找看有没有相关的命令选项可以控制报错时候的编码

https://gcc.gnu.org/onlinedocs/gcc-11.3.0/gcc/#toc-GCC-Command-Options
页: [1]
查看完整版本: 关于mingw-w64报错下的中文处理