Gforth-如何获取字符串的代码点?

问题描述

我知道gforth将字符作为代码点存储在堆栈中,但是material I'm learning from没有显示任何有助于将每个字符转换为代码点的单词。

我也想对字符串的代码点求和。我该怎么做?

解决方法

字符和代码点在Forth中无法区分。也就是说,无法获得不是代码点的字符。

在Forth中,您可以区分原始字符(ASCII)和扩展字符(Unicode)。

另请参见Extended-Character word set

扩展字符存储在编码为一个或多个原始字符(pchars)的内存中。

要读取原始字符(ASCII或pchar,通常是八位字节),我们使用c@ ( c-addr -- char )

: sum-codes ( c-addr u -- sum ) 0 -rot over + swap ?do i c@ + 1 chars +loop ;

\ test
"test passed" sum-codes .

NB:Gforth的最新版本支持本机字符串文字。在此之前,您需要将s"一词用作s" test passed"

要阅读扩展字符,我们可以使用xc@+ ( xc-addr1 -- xc-addr2 xchar )

: sum-xcodes ( c-addr u -- sum )
  over + >r 0 swap
  begin ( sum xc-addr ) dup r@ u< while
    xc@+ ( sum xc-addr2 xchar ) swap >r + r>
  repeat drop rdrop
;

\ test
"test ⇦ ⇨ ⇧ ⇩" 2dup dump cr sum-xcodes . cr

dump显示在Gforth中,字符以UTF-8编码存储在内存中。