【问题标题】:How to transliterate Polish alphabet with US-ASCII?如何用 US-ASCII 音译波兰字母?
【发布时间】:2018-07-19 01:29:23
【问题描述】:

是否有一种或多或少的标准方法来用原始 ASCII(US-ASCII)字符转写波兰字母?

这个问题可以分成两个相关的更精确的问题:

  1. 如何将 32 个波兰字母与 26 个基本拉丁字母最大限度地理解波兰语读者转写?
  2. 是否有一种可逆方法可以用 US-ASCII 字符音译任何波兰语文本?

我可以看到大多数波兰网站只是删除了 URL 中的变音符号。例如:

Świętosław Milczący    →  Swietoslaw Milczacy
Dzierżykraj Łaźniński  →  Dzierzykraj Lazninski
Józef Soćko            →  Jozef Socko

这很难逆转,但它是波兰读者最易读的音译吗?

在某些其他情况下,可能会使用更复杂的 ad hoc 音译,例如 Wałęsa → Wawensa。进行后一种转换是否有任何标准规则?

附:澄清一下,我对音译规则(如ł → wę → en)感兴趣,而不是实现。类似this table

【问题讨论】:

  • 你能加撇号吗,例如S'wie'tosl'aw?
  • @i486,第二个问题可以。
  • 我投票结束这个问题,因为它与编程无关。
  • @HighPerformanceMark,我认为这是一个算法问题。我的目的是将波兰语字母音译为网站的 URI,以便将 URI 反转为正确的波兰语。

标签: transliteration polish


【解决方案1】:

您可以将变音符号的存在编码为某种三进制数,并将它们存储在纯 ASCII 音译附近以使其可逆。

URL 通常包含一些额外的 ID,甚至是这个:48686148/how-to-transliterate-polish-alphabet-with-us-ascii

这里是示例实现:

trans_table = {
    'A': ('A', 0),   'a': ('a', 0),
    'Ą': ('A', 1),   'ą': ('a', 1),
    'B': ('B', 0),   'b': ('b', 0),
    'C': ('C', 0),   'c': ('c', 0),
    'Ć': ('C', 1),   'ć': ('c', 1),
    'D': ('D', 0),   'd': ('d', 0),
    'E': ('E', 0),   'e': ('e', 0),
    'Ę': ('E', 1),   'ę': ('e', 1),
    'F': ('F', 0),   'f': ('f', 0),
    'G': ('G', 0),   'g': ('g', 0),
    'H': ('H', 0),   'h': ('h', 0),
    'I': ('I', 0),   'i': ('i', 0),
    'J': ('J', 0),   'j': ('j', 0),
    'K': ('K', 0),   'k': ('k', 0),
    'L': ('L', 0),   'l': ('l', 0),
    'Ł': ('L', 1),   'ł': ('l', 1),
    'M': ('M', 0),   'm': ('m', 0),
    'N': ('N', 0),   'n': ('n', 0),
    'Ń': ('N', 1),   'ń': ('n', 1),
    'O': ('O', 0),   'o': ('o', 0),
    'Ó': ('O', 1),   'ó': ('o', 1),
    'P': ('P', 0),   'p': ('p', 0),
    'R': ('R', 0),   'r': ('r', 0),
    'S': ('S', 0),   's': ('s', 0),
    'Ś': ('S', 1),   'ś': ('s', 1),
    'T': ('T', 0),   't': ('t', 0),
    'U': ('U', 0),   'u': ('u', 0),
    'W': ('W', 0),   'w': ('w', 0),
    'Y': ('Y', 0),   'y': ('y', 0),
    'Z': ('Z', 0),   'z': ('z', 0),
    'Ź': ('Z', 1),   'ź': ('z', 1),
    'Ż': ('Z', 2),   'ż': ('z', 2),
}



def pol2ascii(text):
    plain = []
    diacritics = []
    for c in text:
        ascii_char, diacritic = trans_table.get(c, (c, 0))
        plain.append(ascii_char)
        diacritics.append(str(diacritic))

    return ''.join(plain) + '_' + hex(int('1' + ''.join(reversed(diacritics)), 3))[2:]

reverse_trans_table = {
    k: v for v, k in trans_table.items()
}

def ascii2pol(text):
    plain, diacritics = text.rsplit('_', 1)
    diacritics = int(diacritics, base=16)
    res = []

    for c in plain:
        diacritic = diacritics % 3
        diacritics = diacritics // 3
        pol_char = reverse_trans_table.get((c, diacritic), c)
        res.append(pol_char)

    return ''.join(res)


TESTS = '''
Świętosław Milczący
Dzierżykraj Łaźniński
Józef Soćko
'''

for l in TESTS.strip().splitlines():
    plain = pol2ascii(l)
    original = ascii2pol(plain)
    print(original, plain)
    assert original == l

【讨论】:

  • 我喜欢三元的想法!为了进一步最小化数值,可以跳过从未有的字符的所有变音符号。例如mówi -> mowi_4(三进制 11),mowa -> mowa_9(或只是 mowa;三进制 100)。尽管我的目标是避免使用任何额外的数值。
  • @AndriyMakukha 是的,另外我们可以使用二进制,将 Z 编码为 0,使用 1 将带有变音符号的 Z 编码,并使用下一位来区分它们。然后 URL 中的附加文本从 50% 减少到 20%:gist.github.com/bunyk/688a457acfc24f682d8bc2ef1a00d693 如果我们使用 urlsafe base64 编码而不是十六进制,它可能会更紧凑。
  • 我会改用十进制值,因为 base64 会导致 URL 出现外观或脏话。即使是十六进制也可能导致不需要的单词,例如“死”;)我不希望我的 URL 看起来像:Dziwny-wpis-Walesy-Udostepnil-skandaliczna-grafike-z-Janem-Pawlem-II_DEAD;)
【解决方案2】:

广告。 1. 波兰字母表仅由两组字母组成:拉丁字母和带变音符号的拉丁字母。因此,唯一使用的方法转写波兰字母是删除最后一组的变音符号,例如:

ą --> a
ć --> c
ż --> z
ź --> z
...

这种方式最易读的音译。

广告。 2.绝对没有。

【讨论】:

  • 谢谢!有一种完全可逆的方式可以用 US-ASCII 音译乌克兰语,所以我很确定波兰语也可以。但仍然感谢您的反馈。
猜你喜欢
  • 2019-04-02
  • 1970-01-01
  • 2017-04-11
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2018-05-31
相关资源
最近更新 更多