首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在晶体中迭代字形素簇?

如何在晶体中迭代字形素簇?
EN

Stack Overflow用户
提问于 2021-04-29 12:45:40
回答 1查看 99关注 0票数 1

Unicode标准将http://www.unicode.org/reports/tr29/定义为“用户感知的字符”的算法近似。一个字素簇或多或少地对应于人们认为文本中的单个“字符”。因此,能够将字符串作为字形簇的序列来操作是编程中的一个自然和重要的要求。

最好的通用字形聚类定义是扩展的字素聚类;还有其他的字素聚类算法(一个定制的字素聚类算法),用于特定的本地化用法。

在水晶中,我如何迭代(或以其他方式操作)一个String作为一个图形素簇的序列?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-29 12:45:40

这个答案基于https://forum.crystal-lang.org/t/iterate-over-extended-grapheme-clusters-in-a-string/3199中的一个线程。

水晶没有一个内置的方式来做这个(不幸)在1.0.0。

但是,水晶中的regex引擎可以使用与单个扩展的图形素簇匹配的\X模式:

代码语言:javascript
运行
复制
"\u0067\u0308\u1100\u1161\u11A8".scan(/\X/) do |match|
  grapheme = match[0]
  puts grapheme
end

# Output:
# g̈
# 각

https://play.crystal-lang.org/#/r/b0ln

您可以将其封装在一个更好的API中,如下所示:

代码语言:javascript
运行
复制
def each_grapheme(s : String, &)
  s.scan(/\X/) do |match|
    yield match[0]
  end
end

def graphemes(s : String) : Array(String)
  result = Array(String).new
  each_grapheme(s) do |g|
    result << g
  end
  return result
end

# Example from https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
s = "\u{E9}\u{65}\u{301}\u{D55C}\u{1112}\u{1161}\u{11AB}"
each_grapheme(s) do |g|
  puts "#{g}\t#{g.codepoints}"
end

# Output:
# é [233]
# é    [101, 769]
# 한 [54620]
# 한   [4370, 4449, 4523]

https://play.crystal-lang.org/#/r/b19u

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67317662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档