Fortran如何正确输出重音字符 实现类似C的locale设置避免打印乱码
Fortran 区域字符集适配(Windows MinGW64 gfortran环境)
Fortran 完全可以实现和C语言一致的带重音字符输出适配,针对你使用的MSYS2 MinGW64 gfortran环境,有以下几种可直接落地的实现方式:
方法一:互操作调用C标准库setlocale(和C语言逻辑完全一致)
Fortran 2003标准开始原生支持C语言互操作,不需要依赖额外的Fortran专属locale库,直接绑定调用C标准库的setlocale函数即可,效果和你写C代码时完全相同。
可直接运行的示例代码:
program hello use, intrinsic :: iso_c_binding implicit none ! 声明C库setlocale函数接口 interface function c_setlocale(category, locale) bind(C, name='setlocale') import :: c_int, c_ptr integer(c_int), value :: category character(kind=c_char), intent(in) :: locale(*) type(c_ptr) :: c_setlocale end function c_setlocale end interface ! MinGW环境下LC_ALL常量对应值为0 integer(c_int), parameter :: LC_ALL = 0_c_int type(c_ptr) :: locale_ret ! 调用设置葡萄牙语区域,注意C字符串末尾必须加空结束符 locale_ret = c_setlocale(LC_ALL, c_char_"Portuguese"//c_null_char) print *, "A maçã caiu na cebeça dele! É a gravidade." end program hello
注意:传入C函数的字符串必须在末尾拼接
c_null_char,否则会因为缺少C字符串结束符引发内存异常。
方法二:编译期指定执行字符集(无需修改源码)
你遇到乱码的核心原因是编码不匹配:MinGW gfortran默认将源文件按UTF-8编码编译为可执行文件,但Windows传统控制台(cmd、旧版PowerShell)默认使用本地代码页(简体中文环境为GBK/CP936),编码不一致就会出现乱码。
你只需要在编译时增加参数指定执行字符集,和控制台代码页匹配即可:
- 如果使用传统cmd控制台输出葡萄牙语内容,编译时加参数
-fexec-charset=CP850(CP850是西欧/葡萄牙语适配的DOS控制台代码页),编译命令示例:
gfortran -fexec-charset=CP850 hello.f90 -o hello.exe
- 如果使用Windows Terminal等支持UTF-8的终端,编译时加参数
-fexec-charset=UTF-8,运行前在终端执行chcp 65001切换到UTF-8代码页即可正常显示。
在Code::Blocks、CLion中使用时,直接把上述编译参数添加到编译器的额外选项里即可,不需要改动Fortran源码。
方法三:配置gfortran运行时环境变量
gfortran自带运行时字符转码能力,你可以在运行程序前设置两个环境变量,不需要改代码也不需要加特殊编译参数:
GFORTRAN_STDIN_UNIT=CP850 GFORTRAN_STDOUT_UNIT=CP850
设置完成后gfortran运行时会自动对标准输入输出的字符做编码转换,适配葡萄牙语等带重音符号的字符显示。
内容的提问来源于stack exchange,提问作者lucenalex
相关产品推荐
相关产品推荐

