111 lines
3.4 KiB
Python
111 lines
3.4 KiB
Python
|
#!/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()
|