Gforth - 如何获取字符串的代码点?
Gforth - How to get codepoints of a string?
我知道 gforth 将字符存储为堆栈中的代码点,但是 material I'm learning from 没有显示任何有助于将每个字符转换为代码点的单词。
我也想求和字符串的代码点。我应该用什么来做到这一点?
在 Forth 中,我们区分原始字符(通常是覆盖 ASCII 的八位字节)和扩展字符(通常是 Unicode)。
任何字符在堆栈中始终表示为其代码点,但扩展字符在内存中的表示方式取决于实现。
另见 Extended-Character word set:
Extended characters are stored in memory encoded as one or more primitive characters (pchars).
所以要将一个字符转换成代码点,从内存中读取这个字符就足够了。
要读取原始字符,我们使用 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 .
注意:最新版本的 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编码存储在内存中
我知道 gforth 将字符存储为堆栈中的代码点,但是 material I'm learning from 没有显示任何有助于将每个字符转换为代码点的单词。
我也想求和字符串的代码点。我应该用什么来做到这一点?
在 Forth 中,我们区分原始字符(通常是覆盖 ASCII 的八位字节)和扩展字符(通常是 Unicode)。
任何字符在堆栈中始终表示为其代码点,但扩展字符在内存中的表示方式取决于实现。
另见 Extended-Character word set:
Extended characters are stored in memory encoded as one or more primitive characters (pchars).
所以要将一个字符转换成代码点,从内存中读取这个字符就足够了。
要读取原始字符,我们使用 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 .
注意:最新版本的 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编码存储在内存中