#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Windows 控制台编码修复模块 用于解决 Windows 下 Unicode 字符显示问题 """ import sys import os def setup_console_encoding(): """设置控制台编码为 UTF-8""" if sys.platform.startswith('win'): try: # 方法1: 设置环境变量 os.environ['PYTHONIOENCODING'] = 'utf-8' # 方法2: 重新配置标准流 import codecs import io # 检查是否已经是正确的编码 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding.lower() not in ['utf-8', 'utf8']: # 只有在需要时才重新配置 if hasattr(sys.stdout, 'detach'): sys.stdout = io.TextIOWrapper( sys.stdout.detach(), encoding='utf-8', errors='replace' ) sys.stderr = io.TextIOWrapper( sys.stderr.detach(), encoding='utf-8', errors='replace' ) if hasattr(sys.stdin, 'detach'): sys.stdin = io.TextIOWrapper( sys.stdin.detach(), encoding='utf-8', errors='replace' ) return True except Exception as e: print(f"Warning: Could not set UTF-8 encoding: {e}") return False return True def safe_print(text, fallback_text=None): """安全打印,如果遇到编码错误则使用备用文本""" try: print(text) except UnicodeEncodeError: if fallback_text: try: print(fallback_text) except UnicodeEncodeError: print("Message with special characters (encoding issue)") else: # 移除非ASCII字符的简单版本 ascii_text = text.encode('ascii', errors='ignore').decode('ascii') print(ascii_text if ascii_text.strip() else "Message (encoding issue)") def get_safe_emoji_text(emoji_text, fallback_text): """获取安全的emoji文本,如果不支持则返回备用文本""" try: # 测试是否能编码 emoji_text.encode(sys.stdout.encoding or 'utf-8') return emoji_text except (UnicodeEncodeError, LookupError): return fallback_text # 预定义的安全文本映射 EMOJI_FALLBACKS = { "🚀": "[START]", "📍": "[ADDR]", "⏰": "[TIME]", "✅": "[OK]", "🔗": "[CONN]", "📨": "[MSG]", "❌": "[ERROR]", "🔌": "[DISC]", "📋": "[LIST]", "🖥️": "[SERVER]", "💻": "[CLIENT]", "📁": "[FILE]", "🎯": "[RESULT]", "⚠️": "[WARN]", "📊": "[REPORT]", "🧪": "[TEST]", "🎮": "[INTERACTIVE]", "📤": "[SEND]", "📥": "[RECV]", "👉": "[INPUT]", "👋": "[EXIT]", "🎉": "[SUCCESS]", "🔧": "[FIX]", "⛔": "[STOP]", "💡": "[TIP]" } def safe_format_message(message): """将消息中的emoji替换为安全的文本""" for emoji, fallback in EMOJI_FALLBACKS.items(): message = message.replace(emoji, fallback) return message # 自动设置编码 if __name__ != "__main__": setup_console_encoding()