从字符串中提取单个unicode字符

时间:2015-07-26 02:21:43

标签: string unicode character-encoding fortran

当我偶然发现unicode字符时问题就开始了。例如,árbol。现在我通过询问i位置的字符,即string (i:i)是否小于127来处理这个问题。这意味着它属于ASCII表,我知道{{{ 1}}是 完整的单个字符 。在另一种情况string (i:i)和我的示例'árbol'中,(>= 127) 完整字符

我认为我处理字符串的方式解决了我的实际目的(处理西班牙语,波兰语和俄语文件)的问题,但是在处理中文字母的情况下,字符可能占用4个字节然后我会有问题。

有没有办法在fortran中挑出字符串中的unicode字符?

1 个答案:

答案 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_10646selected_char_kind ('ISO_10646')会返回-1。使用ifort 15.0.0,我收到与here所述相同的消息。