【问题标题】:Gforth - How to get codepoints of a string?Gforth - 如何获取字符串的代码点?
【发布时间】:2021-02-17 19:16:05
【问题描述】:

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

我还想对字符串的代码点求和。我应该用什么来做到这一点?

【问题讨论】:

  • 您能否提供一个代码示例,您想做什么?你如何获得 Forth 中的字符?

标签: string stack forth gforth codepoint


【解决方案1】:

在 Forth 中,我们区分原始字符(通常是覆盖 ASCII 的八位字节)和扩展字符(通常是 Unicode)。

任何字符总是在堆栈中表示为其代码点,但扩展字符在内存中的表示方式取决于实现。

另见Extended-Character word set

扩展字符存储在内存中,编码为一个或多个原始字符 (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 编码存储在内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2017-12-20
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多