有没有可以用来生成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
,那么你最终会得到四个模式,用于所有组合A
和D
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 源代码并了解如何删除过时的构造:-)
[我已将此答案标记为“社区维基”,如果有人足够了解语言来测试解决方案,那么请随意编辑(或添加您自己的答案,我会删除它)]