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() |