【问题标题】:Extract single unicode character from string从字符串中提取单个 unicode 字符
【发布时间】:2015-10-16 10:53:20
【问题描述】:

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

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

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

【问题讨论】:

  • 您的 Fortran 处理器是否支持 ISO 10646(即 UCS-4)字符类型?如果是这样,并且您使用该字符类型,那么引用单个字符是一个简单的操作。
  • 假设它确实支持,我如何引用单个字符。是否与使用模块 ISO_FORTRAN_ENV 有关系
  • string(i:i)(我确实说过这是微不足道的!)对于 ISO 10646 字符类型,字符串中的每个字符都代表一个 unicode 代码点。可使用 SELECTED_CHAR_KIND 内在函数获得用于 ISO 10646 字符类型的值。
  • 你确实说过这很简单,但我仍然无法让我的字符串用字符串(i:i)表示一个while代码点,即使我正在使用:integer, parameter :: ucs4 = selected_char_kind ('ISO_10646')@987654329 @
  • 对于 árbol 我现在使用字符串 (1:1) 得到一个 'Ã'。 @IanH

标签: string unicode character-encoding fortran


【解决方案1】:

gfortran 目前不支持 UTF-8 编码文件中的非 ASCII 字符,请参阅here。可以找到对应的bug report here

作为一种解决方法,您可以使用十六进制表示法指定 unicode 字符: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 描述的相同的消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多