Unicode全字符集加解密工具 - 强大的编码转换GUI应用
Unicode全字符集加解密工具 - 强大的编码转换GUI应用
🎯 项目简介
Unicode全字符集加解密工具是一款功能强大的Python GUI应用程序,专门用于处理各种Unicode编码转换和加解密操作。无论是处理特殊字符、emoji表情,还是进行文本加密传输,这个工具都能轻松应对。
✨ 核心功能
🔐 多种编码格式支持
- Unicode转义 (
\uXXXX) - 标准Unicode编码 - Unicode大写 (
\UXXXXXXXX) - 8位大写格式 - HTML实体 (
&#xXXXX;) - 网页兼容格式 - Python转义 - Python原生转义序列
- URL编码 - 百分号编码格式
- Base64编码 - 二进制安全编码
- 全字符转义 - 所有字符统一转义
📊 字符信息分析
- 实时显示每个字符的Unicode码点
- 显示十进制和十六进制编码
- 支持特殊字符和emoji分析
- 字符位置精确定位
📁 文件操作支持
- 批量文件加密/解密
- 大文件处理能力
- 自动编码检测
- 多种格式导出
🛠️ 技术特色
跨平台兼容
# 基于Python标准库开发
import tkinter # 原生GUI支持
import re # 正则表达式处理
import base64 # Base64编码解码
完整Unicode支持
- 支持所有Unicode字符集(U+0000 到 U+10FFFF)
- 处理特殊字符、数学符号、表情符号
- 多语言文本支持(中文、日文、阿拉伯文等)
用户友好设计
- 直观的图形界面
- 实时预览功能
- 错误提示和异常处理
- 一键清空和复制操作
🚀 快速开始
环境要求
- Python 3.6+
- tkinter(通常Python自带)
安装使用
见文末代码
基础使用示例
1. 编码中文文本
输入: 我是ping u,我被molly tea封印整整三天了
选择: Unicode转义编码
输出:
\u6211\u662fping u\uff0c\u6211\u88abmolly tea\u5c01\u5370\u6574\u6574\u4e09\u5929\u4e86
2. 解码营销文案
输入:
noot\u2014\u2014noot\u2014\u2014\u6211\u662fping u\uff0c\u6211\u88abmolly tea\u5c01\u5370\u6574\u6574\u4e09\u5929\u4e86
输出:
noot——noot——我是ping u,我被molly tea封印整整三天了
💡 应用场景
🎨 营销文案处理
# 创意营销 - 编码解密互动
original = "新品复活我,助我和家人团聚!"
encoded = "\u65b0\u54c1\u590d\u6d3b\u6211\uff0c\u52a9\u6211\u548c\u5bb6\u4eba\u56e2\u805a\uff01"
🔒 数据安全传输
- 敏感信息编码
- 跨平台文本传输
- 防止字符集乱码
🌐 多语言开发
- 国际化文本处理
- 特殊字符转义
- 编码格式转换
📈 性能特点
高效处理
- 支持大文本文件处理
- 实时编码解码
- 内存优化设计
稳定可靠
- 完整的错误处理机制
- 编码格式自动检测
- 异常情况友好提示
🔧 高级功能
批量处理
支持多个文件同时进行编码转换,提高工作效率。
自定义配置
用户可以根据需要调整界面样式和默认编码格式。
扩展接口
提供清晰的代码结构,便于二次开发和功能扩展。
🤝 贡献指南
我们欢迎各种形式的贡献!
- 提交Issue报告问题
- 发起Pull Request贡献代码
- 完善文档和测试用例
- 分享使用经验和案例
📄 许可证
本项目采用MIT开源许可证
🌟 更新日志
v1.0.0 (2024-01-20)
- ✅ 基础Unicode编码解码功能
- ✅ 图形用户界面
- ✅ 文件操作支持
- ✅ 多格式编码支持
让我们一起构建更好的开发工具!
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox, filedialog
import re
import json
import urllib.parse
import base64class UnicodeCryptoGUI:def __init__(self, root):self.root = rootself.root.title("Unicode 全字符集加解密工具")self.root.geometry("900x700")# 创建样式self.setup_style()# 创建界面self.create_widgets()def setup_style(self):"""设置界面样式"""style = ttk.Style()style.configure('TFrame', background='#f0f0f0')style.configure('TButton', font=('Microsoft YaHei', 10))style.configure('TLabel', background='#f0f0f0', font=('Microsoft YaHei', 10))style.configure('Title.TLabel', font=('Microsoft YaHei', 12, 'bold'))def create_widgets(self):"""创建界面组件"""# 主框架main_frame = ttk.Frame(self.root, padding="10")main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))# 标题title_label = ttk.Label(main_frame, text="Unicode 全字符集加解密工具", style='Title.TLabel')title_label.grid(row=0, column=0, columnspan=3, pady=(0, 20))# 编码格式选择encoding_frame = ttk.LabelFrame(main_frame, text="编码格式设置", padding="10")encoding_frame.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))self.encoding_var = tk.StringVar(value="unicode_escape")encodings = [("Unicode 转义 (\\uXXXX)", "unicode_escape"),("Unicode 大写 (\\UXXXXXXXX)", "unicode_escape_upper"),("HTML 实体 (&#xXXXX;)", "html_entity"),("Python 转义", "python_escape"),("URL 编码", "url_encode"),("Base64", "base64"),("全部字符转义", "all_escape")]for i, (text, value) in enumerate(encodings):rb = ttk.Radiobutton(encoding_frame, text=text, variable=self.encoding_var, value=value)rb.grid(row=i//3, column=i%3, sticky=tk.W, padx=5, pady=2)# 输入区域input_frame = ttk.LabelFrame(main_frame, text="输入文本", padding="10")input_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=(0, 10))self.input_text = scrolledtext.ScrolledText(input_frame, height=8, width=80, font=('Consolas', 10))self.input_text.grid(row=0, column=0, columnspan=2, sticky=(tk.W, tk.E, tk.N, tk.S))# 按钮区域button_frame = ttk.Frame(main_frame)button_frame.grid(row=3, column=0, columnspan=3, pady=10)ttk.Button(button_frame, text="编码", command=self.encode_text).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="解码", command=self.decode_text).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="清空", command=self.clear_text).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="文件加密", command=self.encrypt_file).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="文件解密", command=self.decrypt_file).pack(side=tk.LEFT, padx=5)# 输出区域output_frame = ttk.LabelFrame(main_frame, text="输出结果", padding="10")output_frame.grid(row=4, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=(0, 10))self.output_text = scrolledtext.ScrolledText(output_frame, height=8, width=80, font=('Consolas', 10))self.output_text.grid(row=0, column=0, columnspan=2, sticky=(tk.W, tk.E, tk.N, tk.S))# 字符信息区域info_frame = ttk.LabelFrame(main_frame, text="字符信息", padding="10")info_frame.grid(row=5, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))self.info_text = scrolledtext.ScrolledText(info_frame, height=4, width=80, font=('Consolas', 9))self.info_text.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))# 配置网格权重self.root.columnconfigure(0, weight=1)self.root.rowconfigure(0, weight=1)main_frame.columnconfigure(0, weight=1)main_frame.rowconfigure(2, weight=1)main_frame.rowconfigure(4, weight=1)input_frame.columnconfigure(0, weight=1)input_frame.rowconfigure(0, weight=1)output_frame.columnconfigure(0, weight=1)output_frame.rowconfigure(0, weight=1)info_frame.columnconfigure(0, weight=1)info_frame.rowconfigure(0, weight=1)def encode_text(self):"""编码文本"""try:input_str = self.input_text.get("1.0", tk.END).strip()if not input_str:messagebox.showwarning("警告", "请输入要编码的文本")returnencoding_type = self.encoding_var.get()encoded = self._encode_string(input_str, encoding_type)self.output_text.delete("1.0", tk.END)self.output_text.insert("1.0", encoded)self._show_char_info(input_str)except Exception as e:messagebox.showerror("错误", f"编码时发生错误: {str(e)}")def decode_text(self):"""解码文本"""try:input_str = self.input_text.get("1.0", tk.END).strip()if not input_str:messagebox.showwarning("警告", "请输入要解码的文本")returnencoding_type = self.encoding_var.get()decoded = self._decode_string(input_str, encoding_type)self.output_text.delete("1.0", tk.END)self.output_text.insert("1.0", decoded)self._show_char_info(decoded)except Exception as e:messagebox.showerror("错误", f"解码时发生错误: {str(e)}")def _encode_string(self, text, encoding_type):"""根据编码类型编码字符串"""if encoding_type == "unicode_escape":return self._to_unicode_escape(text, False)elif encoding_type == "unicode_escape_upper":return self._to_unicode_escape(text, True)elif encoding_type == "html_entity":return self._to_html_entity(text)elif encoding_type == "python_escape":return self._to_python_escape(text)elif encoding_type == "url_encode":return self._to_url_encode(text)elif encoding_type == "base64":return self._to_base64(text)elif encoding_type == "all_escape":return self._to_all_escape(text)else:return textdef _decode_string(self, text, encoding_type):"""根据编码类型解码字符串"""if encoding_type == "unicode_escape":return self._from_unicode_escape(text)elif encoding_type == "unicode_escape_upper":return self._from_unicode_escape(text.replace('\\U', '\\u'))elif encoding_type == "html_entity":return self._from_html_entity(text)elif encoding_type == "python_escape":return self._from_python_escape(text)elif encoding_type == "url_encode":return self._from_url_encode(text)elif encoding_type == "base64":return self._from_base64(text)elif encoding_type == "all_escape":return self._from_all_escape(text)else:return textdef _to_unicode_escape(self, text, uppercase=False):"""转换为Unicode转义序列"""result = []for char in text:code_point = ord(char)if code_point > 127 or char in '\\':if uppercase:result.append(f'\\U{code_point:08X}')else:result.append(f'\\u{code_point:04x}')else:result.append(char)return ''.join(result)def _from_unicode_escape(self, text):"""从Unicode转义序列解码"""# 处理 \uXXXXtext = re.sub(r'\\u([0-9a-fA-F]{4})', lambda m: chr(int(m.group(1), 16)), text)# 处理 \UXXXXXXXXtext = re.sub(r'\\U([0-9a-fA-F]{8})', lambda m: chr(int(m.group(1), 16)), text)return textdef _to_html_entity(self, text):"""转换为HTML实体"""return ''.join(f'&#{ord(char)};' if ord(char) > 127 else char for char in text)def _from_html_entity(self, text):"""从HTML实体解码"""return re.sub(r'&#(\d+);', lambda m: chr(int(m.group(1))), text)def _to_python_escape(self, text):"""转换为Python转义序列"""return text.encode('unicode_escape').decode('ascii')def _from_python_escape(self, text):"""从Python转义序列解码"""return text.encode('ascii').decode('unicode_escape')def _to_url_encode(self, text):"""转换为URL编码"""return urllib.parse.quote(text, encoding='utf-8')def _from_url_encode(self, text):"""从URL编码解码"""return urllib.parse.unquote(text, encoding='utf-8')def _to_base64(self, text):"""转换为Base64"""encoded = base64.b64encode(text.encode('utf-8'))return encoded.decode('ascii')def _from_base64(self, text):"""从Base64解码"""try:decoded = base64.b64decode(text)return decoded.decode('utf-8')except:return "Base64解码错误"def _to_all_escape(self, text):"""所有字符都转义"""return ''.join(f'\\u{ord(char):04x}' for char in text)def _from_all_escape(self, text):"""从全转义解码"""return self._from_unicode_escape(text)def _show_char_info(self, text):"""显示字符信息"""info = []for i, char in enumerate(text):code_point = ord(char)info.append(f"位置 {i}: '{char}' -> U+{code_point:04X} (十进制: {code_point})")if len(info) >= 20: # 限制显示数量info.append("... (更多字符未显示)")breakself.info_text.delete("1.0", tk.END)self.info_text.insert("1.0", '\n'.join(info))def clear_text(self):"""清空文本"""self.input_text.delete("1.0", tk.END)self.output_text.delete("1.0", tk.END)self.info_text.delete("1.0", tk.END)def encrypt_file(self):"""加密文件"""filename = filedialog.askopenfilename(title="选择要加密的文件")if filename:try:with open(filename, 'r', encoding='utf-8') as f:content = f.read()encoded = self._encode_string(content, self.encoding_var.get())save_filename = filedialog.asksaveasfilename(title="保存加密文件",defaultextension=".txt")if save_filename:with open(save_filename, 'w', encoding='utf-8') as f:f.write(encoded)messagebox.showinfo("成功", "文件加密完成")except Exception as e:messagebox.showerror("错误", f"文件加密失败: {str(e)}")def decrypt_file(self):"""解密文件"""filename = filedialog.askopenfilename(title="选择要解密的文件")if filename:try:with open(filename, 'r', encoding='utf-8') as f:content = f.read()decoded = self._decode_string(content, self.encoding_var.get())save_filename = filedialog.asksaveasfilename(title="保存解密文件",defaultextension=".txt")if save_filename:with open(save_filename, 'w', encoding='utf-8') as f:f.write(decoded)messagebox.showinfo("成功", "文件解密完成")except Exception as e:messagebox.showerror("错误", f"文件解密失败: {str(e)}")def main():root = tk.Tk()app = UnicodeCryptoGUI(root)root.mainloop()if __name__ == "__main__":main()
