如何从红宝石的希伯来语utf-8中剥离元音/ nekudot /变音符号?

时间:2018-07-06 14:53:35

标签: ruby utf-8 hebrew

希伯来语将元音打印为字母周围的nekudot /点。
带有元音的单词:“יִתְגַּבֵּרכַּאֲרִילַעֲמֹדבַּבֹּקֶרלַעֲבוֹדַתבּוֹרְאוֹשֶׁיְּהֵאהוּאמְעוֹרֵרהַשַּׁחַר”
没有元音:“יתגבתגארילעמודבבקרלעבודתבוראושיהאהואמעוררהשחר”

我需要一种从弦上剥离这些元音的方法。与将带元音的字符串转换为不带元音的字符串一样。有什么建议吗?

-p.s。

我尝试过“ hebrew.gsub(/ [^א-ת] /,'')” 但这有两个问题:a:这将删除所有标点符号,英语等。我只想删除元音。 b:一些字母也被删除。 (我的理解是有限的,但是似乎某些字母/元音组合在utf-8中变成了“多字节”,与“א-ת”不匹配。

我在网上找到了这个:https://gist.github.com/yakovsh/345a71d841871cc3d375,但红宝石建议仅适用于滑轨(假设它完全适用)。 但是,该页面可能有助于找到解决方案。

请帮助,谢谢。

1 个答案:

答案 0 :(得分:4)

元音都在U + 0591和U + 05C7之间,因此您只需

hebrew.gsub(/[\u0591-\u05c7]/,"")

例如

" יִתְגַּבֵּר כַּאֲרִי לַעֲמֹד בַּבֹּקֶר לַעֲבוֹדַת בּוֹרְאוֹ שֶׁיְּהֵא הוּא מְעוֹרֵר הַשַּׁחַר".gsub(/[\u0591-\u05c7]/,"")
# => " יתגבר כארי לעמד בבקר לעבודת בוראו שיהא הוא מעורר השחר"

但是,仅当元音在字符串中都是单独的字符时才有效-如果文本使用规范化形式D,则用Unicode说同样的话。您可以通过调用{{ 3}}首先:

hebrew.unicode_normalize(:nfd).gsub(/[\u0591-\u05c7]/,"")

此步骤之所以必要,是因为Unicode包含几个单个字符,这些字符在一个代码点中将字母和 nekuddot 组合在一起,以便与不支持变音符号组合的较旧字符集进行双向兼容。这些字符意味着您不能仅通过查看字符串“בּ”是由两个代码点序列U+05D1 HEBREW LETTER BET后面紧跟U+05BC HEBREW POINT DAGESH OR MAPIQ还是仅由单个字符U+FB31 HEBREW LETTER BET WITH DAGESH组成来辨别。将字符串放入规范化表格D中,将后者替换为规范化表格D,并将所有其他“预组合”字符分成其组成部分。