Python 实现拉丁字母到西里尔字母的映射式转换(非音译)

2次阅读

Python 实现拉丁字母到西里尔字母的映射式转换(非音译)

本文介绍如何在 python 中实现基于键盘布局映射的拉丁字符到西里尔字符转换(如“ghbdtn”→“привет”),而非基于发音的音译,适用于俄语 qwerty 键盘误输场景。

在俄语输入环境中,用户常因切换输入法失败而用英文键盘“盲打”俄语单词——即按俄语键盘布局(如 ЙЦУКЕН)的位置,敲击对应英文键盘(QWERTY)上的键位,导致出现类似 ghbdtn(实际想输入 привет)的字符串。这种转换本质是键盘布局映射(keyboard layout mapping),而非语言学意义上的音译(transliteration)。因此,unidecode 等音译库在此场景下并不适用——它会将 privet 音译为 привет,但无法将 ghbdtn 这类布局错位串正确还原。

正确的解决方案是构建一个俄语 ЙЦУКЕН 与英文 QWERTY 键位的一一映射字典,然后逐字符替换。以下是推荐实现方式:

def latin_to_cyrillic(text: str) -> str:     # 俄语 ЙЦУКЕН 布局(上排)对应英文 QWERTY 键位(标准美式键盘)     mapping = {         'q': 'й', 'w': 'ц', 'e': 'у', 'r': 'к', 't': 'е', 'y': 'н', 'u': 'г', 'i': 'ш', 'o': 'щ', 'p': 'з',         '[': 'х', ']': 'ъ', 'a': 'ф', 's': 'ы', 'd': 'в', 'f': 'а', 'g': 'п', 'h': 'р', 'j': 'о', 'k': 'л',         'l': 'д', ';': 'ж', "'": 'э', 'z': 'я', 'x': 'ч', 'c': 'с', 'v': 'м', 'b': 'и', 'n': 'т', 'm': 'ь',         ',': 'б', '.': 'ю', '/': '.',         # 大写映射(可选,保持大小写一致性)         'Q': 'Й', 'W': 'Ц', 'E': 'У', 'R': 'К', 'T': 'Е', 'Y': 'Н', 'U': 'Г', 'I': 'Ш', 'O': 'Щ', 'P': 'З',         '{': 'Х', '}': 'Ъ', 'A': 'Ф', 'S': 'Ы', 'D': 'В', 'F': 'А', 'G': 'П', 'H': 'Р', 'J': 'О', 'K': 'Л',         'L': 'Д', ':': 'Ж', '"': 'Э', 'Z': 'Я', 'X': 'Ч', 'C': 'С', 'V': 'М', 'B': 'И', 'N': 'Т', 'M': 'Ь',         '<': 'Б', '>': 'Ю', '?': '.',         # 空格、数字、标点等保持原样(或按需扩展)         ' ': ' ', '0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',         '-': '-', '=': '=', '\': '\', '`': '`', '~': '~', '!': '!', '@': '@', '#': '#', '$': '$', '%': '%',         '^': '^', '&': '&', '*': '*', '(': '(', ')': ')', '_': '_', '+': '+', '|': '|', '"': '"'     }      return ''.join(mapping.get(char, char) for char in text)  # 示例使用 print(latin_to_cyrillic("ghbdtn"))      # 输出:привет print(latin_to_cyrillic("rof,rj"))      # 输出:как дела print(latin_to_cyrillic("JGUTKBYF"))    # 输出:ПРИВЕТ

⚠️ 注意事项

  • 此映射严格依赖标准美式 QWERTY 键盘 + 俄语 ЙЦУКЕН 布局;若目标用户使用其他变体(如德语键盘、Mac 键盘或自定义布局),需调整映射表;
  • 数字和部分符号(如 -, =, [)在不同系统中位置可能不同,建议根据实际测试微调;
  • 不建议依赖 unidecode 库执行此类转换——它专为音译设计(如 cafe → cafe),对 ghbdtn 会返回空或错误结果,并非其设计用途;
  • 如需支持批量处理或 Unicode 归一化(如处理组合字符),可在函数中加入 unicodedata.normalize(‘NFC’, text) 预处理。

该方法轻量、可控、零依赖,适用于命令行工具、Web 表单预处理、聊天机器人纠错等场景。掌握键盘映射逻辑,比盲目调用通用库更能精准解决实际问题。

立即学习Python免费学习笔记(深入)”;

text=ZqhQzanResources