是否有或多或少的标准方法用原始ASCII(US-ASCII)字符音译波兰语字母?
这个问题可以在两个相关且更精确的问题中解决:
我可以看到大多数波兰网站只删除其网址中的变音符号。例如:
Ś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。
答案 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。绝对不会。