Unicode标准将http://www.unicode.org/reports/tr29/定义为“用户感知的字符”的算法近似。一个字素簇或多或少地对应于人们认为文本中的单个“字符”。因此,能够将字符串作为字形簇的序列来操作是编程中的一个自然和重要的要求。
最好的通用字形聚类定义是扩展的字素聚类;还有其他的字素聚类算法(一个定制的字素聚类算法),用于特定的本地化用法。
在水晶中,我如何迭代(或以其他方式操作)一个String
作为一个图形素簇的序列?
发布于 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
模式:
"\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中,如下所示:
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://stackoverflow.com/questions/67317662
复制相似问题