当我偶然发现unicode字符时问题就开始了。例如,árbol。现在我通过询问i
位置的字符,即string (i:i)
是否小于127来处理这个问题。这意味着它属于ASCII表,我知道{{{ 1}}是 完整的单个字符 。在另一种情况string (i:i)
和我的示例'árbol'中,(>= 127)
是 完整字符 。
我认为我处理字符串的方式解决了我的实际目的(处理西班牙语,波兰语和俄语文件)的问题,但是在处理中文字母的情况下,字符可能占用4个字节然后我会有问题。
有没有办法在fortran中挑出字符串中的unicode字符?
答案 0 :(得分:1)
gfortran
目前不支持UTF-8编码文件中的非ASCII字符,请参阅here。您可以找到相应的bug report here。
作为解决方法,您可以使用Hex-notation指定unicode char:char(int(z'00E1'), ucs4)
或'\u00E1'
。后者需要编译选项-fbackslash
来启用反斜杠的评估。
program character_kind
use iso_fortran_env
implicit none
integer, parameter :: ucs4 = selected_char_kind ('ISO_10646')
character(kind=ucs4, len=20) :: string
! string = ucs4_'árbol' ! This does not work
! string = char(int(z'00E1'), ucs4) // ucs4_'rbol' ! This works
string = ucs4_'\u00E1rbol' ! This is also working
open (output_unit, encoding='UTF-8')
print *, string(1:1)
print *, string
end program character_kind
ifort
似乎根本不支持ISO_10646
,selected_char_kind ('ISO_10646')
会返回-1
。使用ifort
15.0.0,我收到与here所述相同的消息。