如何用US-ASCII音译波兰语字母?

时间:2018-02-08 13:02:04

标签: transliteration polish

是否有或多或少的标准方法用原始ASCII(US-ASCII)字符音译波兰语字母?

这个问题可以在两个相关且更精确的问题中解决:

  1. 波兰读者如何用32个基本拉丁字母字母最大限度地理解来音译32个字母的波兰语字母?
  2. 是否有可逆方式来音译任何带有US-ASCII字符的波兰文字?
  3. 我可以看到大多数波兰网站只删除其网址中的变音符号。例如:

    Ś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。进行后一种转换是否有任何标准规则?

    P.S。只是为了澄清,我对音译规则(如ł → wę → en)感兴趣,而不是实现。类似于this table

2 个答案:

答案 0 :(得分:1)

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

URL通常甚至还包含一些其他ID:48686148 /如何使用ascii音译polish-alphabet-

以下是示例实现:

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

答案 1 :(得分:0)

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

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

这种方式是最易读的音译。

广告。 2。绝对不会。