生成 Unicode 连字模式

生成 Unicode 连字模式

有没有可以用来生成unicode连字模式的程序?我已经知道了,opatgen但我无法编译该程序,因为它需要非常旧版本的gcc。

答案1

我本来想将其作为评论保留,因为我从未尝试过,但原则上......

如果您使用的语言少于 256 个字符(或者实际上连字模式中的字符类少于 256 个),您可以将 unicode 槽转换为 0-255 范围,使用 patgen,然后将生成的模式转换回来

我能想到两种方法,如果 ABCD 是你的阿拉伯字母,并且你有一个连字词典

AB-C  BC-DA

然后,您可以使用任何支持 unicode 的编辑工具将 ABCD 更改为拉丁字母 abcd(含义是否混乱,或者两个字母是否映射到同一个拉丁字母,只要所有以相同方式映射的字母都以相同的方式参与连字,都没有关系。因此,假设您使用 perl tr 命令

tr/ABCD/abca/;

那么你的连字词典看起来像

ab-c bc-aa

让 patgen 发挥作用,生成连字模式

a1b4c
b1c4a1a
.1a1b

或者其他,现在要返回,你只需要转换abc回,[AD]BC所以如果一个模式有两个a,那么你最终会得到四个模式,用于所有组合AD

A1B4C
D1B4C

B1C4A1A
B1C4A1D
B1C4D1A
B1C4D1D

.1A1B
.1D1B

这是使用原始字母的图案,希望与现实有某种联系。

在写这篇文章时,我想到了第二种你可以尝试的方法。将 unicode patten 字典保存为 utf-8,然后将其提供给 patgen。对于 patgen 来说,每个多字节序列将是一个字母,但初始字节(前导位 0)和后续字节(前导位 1)之间没有连字符,因此当它生成模式时,你应该得到以下形式的模式(如果你将结果视为 latin1,或等效地视为字节流)

<leading bit 0> <digit> <leading bit 1> <digit> <leading bit 1>

只需删除<digit>前导位为 1 的字符之前的任何字符,您就应该重新构建有效的 utf-8 序列(丢弃任何无效的序列)。

或者当然第三种方法是查看 opatgen 的 C 源代码并了解如何删除过时的构造:-)

[我已将此答案标记为“社区维基”,如果有人足够了解语言来测试解决方案,那么请随意编辑(或添加您自己的答案,我会删除它)]

相关内容