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

标签 string stack forth gforth codepoint

我知道 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 支持 native 字符串文字。在此之前,您需要使用单词s"作为s"测试已通过"

要读取扩展字符,我们可以使用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编码存储在内存中。

关于string - Gforth - 如何获取字符串的代码点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64691168/

相关文章:

compilation - 在编译字中编译匿名字

多核Forth,有吗?

sockets - gforth 是否包含网络套接字功能?

C scanf() 扫描集从控制台读取逗号分隔值(字符串和整数)

algorithm - 为什么我们做 "implement a queue using 2 stacks"?

gdb - 了解局部变量所在的堆栈布局

java - 将 Java 堆栈与字符串元素结合使用

string - 字符串内的换行符显示在 TMemoBox 上

ios - iOS wchar_t 的字节序是什么?

r - 去掉向量字符串元素中空格后面的部分