Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| # 摩斯电码映射字典 | |
| MORSE_CODE_DICT = { | |
| 'A': '._', 'B': '_...', 'C': '_._.', 'D': '_..', 'E': '.', | |
| 'F': '.._.', 'G': '__.', 'H': '....', 'I': '..', 'J': '.___', | |
| 'K': '_._', 'L': '._..', 'M': '__', 'N': '_.', 'O': '___', | |
| 'P': '.__.', 'Q': '__._', 'R': '._.', 'S': '...', 'T': '_', | |
| 'U': '.._', 'V': '..._', 'W': '.__', 'X': '_.._', 'Y': '_.__', 'Z': '__..', | |
| '1': '.____', '2': '..___', '3': '...__', '4': '...._', '5': '.....', | |
| '6': '_....', '7': '__...', '8': '___..', '9': '____.', '0': '_____', | |
| ' ': '/', ',': '__..__', '.': '._._._', '?': '..__..', | |
| '!': '_._..__', '-': '_...._', '/': '_.._.', '@': '.__._.', | |
| '(': '_.__.', ')': '_.__._', '&': '._...', ':': '___...', | |
| ';': '_._._.', '=': '_..._', '+': '._._.', '"': '._.._.', | |
| '$': '..._.._', "'": '.____.', '%': '._.._.', '<': '._.._.', | |
| '>': '._._.', '[': '_.__.', ']': '_.__._', '{': '_.__.', | |
| '}': '_.__._', '\\': '_..__' | |
| } | |
| # 创建摩斯电码到字符的反向映射 | |
| MORSE_CODE_REVERSE = {v: k for k, v in MORSE_CODE_DICT.items()} | |
| def text_to_binary(text): | |
| """将文本转换为二进制""" | |
| binary = ' '.join(format(ord(char), '08b') for char in text) | |
| return binary | |
| def binary_to_text(binary): | |
| """将二进制转换为文本""" | |
| try: | |
| # 删除所有空格 | |
| binary = binary.replace(' ', '') | |
| # 检查是否只包含0和1 | |
| if not all(bit in '01' for bit in binary): | |
| return "错误:二进制只能包含0和1" | |
| # 确保二进制字符串长度是8的倍数 | |
| if len(binary) % 8 != 0: | |
| return "错误:二进制长度必须是8的倍数" | |
| text = '' | |
| for i in range(0, len(binary), 8): | |
| byte = binary[i:i+8] | |
| text += chr(int(byte, 2)) | |
| return text | |
| except Exception as e: | |
| return f"解码错误: {str(e)}" | |
| def text_to_morse(text): | |
| """将文本转换为摩斯电码""" | |
| morse = [] | |
| for char in text.upper(): | |
| if char in MORSE_CODE_DICT: | |
| morse.append(MORSE_CODE_DICT[char]) | |
| else: | |
| # 对于不支持的字符,保持原样 | |
| morse.append(char) | |
| return ' '.join(morse) | |
| def morse_to_text(morse): | |
| """将摩斯电码转换为文本""" | |
| try: | |
| morse = morse.strip() | |
| # 处理单词间的分隔符 '/' | |
| words = morse.split(' / ') | |
| result = [] | |
| for word in words: | |
| chars = word.split(' ') | |
| word_result = '' | |
| for char in chars: | |
| if char in MORSE_CODE_REVERSE: | |
| word_result += MORSE_CODE_REVERSE[char] | |
| elif char == '': | |
| # 跳过空字符 | |
| continue | |
| else: | |
| # 对于不支持的摩斯电码,用问号替代 | |
| word_result += '?' | |
| result.append(word_result) | |
| return ' '.join(result) | |
| except Exception as e: | |
| return f"解码错误: {str(e)}" | |
| def process_encoding(text, method): | |
| """根据选择的方法编码文本""" | |
| if method == "二进制": | |
| return text_to_binary(text) | |
| elif method == "摩斯电码": | |
| return text_to_morse(text) | |
| return "请选择编码方法" | |
| def process_decoding(code, method): | |
| """根据选择的方法解码文本""" | |
| if method == "二进制": | |
| return binary_to_text(code) | |
| elif method == "摩斯电码": | |
| return morse_to_text(code) | |
| return "请选择解码方法" | |
| # 创建 Gradio 界面 | |
| with gr.Blocks(title="文字编码解码工具") as demo: | |
| gr.Markdown("# 文字编码与解码工具") | |
| encode_method = gr.Radio(["二进制", "摩斯电码"], label="编码方法", value="二进制") | |
| with gr.Tab("编码"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| input_text = gr.Textbox(label="输入文本", lines=5, placeholder="Someone tell Vedal there is a problem with my AI") | |
| with gr.Column(): | |
| output_code = gr.Textbox(label="编码结果", lines=5) | |
| encode_btn = gr.Button("编码") | |
| with gr.Tab("解码"): | |
| with gr.Row(): | |
| # decode_method = gr.Radio(["二进制", "摩斯电码"], label="解码方法", value="二进制") | |
| with gr.Column(): | |
| input_code = gr.Textbox(label="输入编码", lines=5, placeholder="请输入要解码的编码") | |
| with gr.Column(): | |
| output_text = gr.Textbox(label="解码结果", lines=5) | |
| decode_btn = gr.Button("解码") | |
| # 设置按钮点击事件 | |
| encode_btn.click(fn=process_encoding, inputs=[input_text, encode_method], outputs=output_code) | |
| decode_btn.click(fn=process_decoding, inputs=[input_code, encode_method], outputs=output_text) | |
| # 启动应用 | |
| if __name__ == "__main__": | |
| demo.launch() |