suwoodblender/encoding_fix.py

111 lines
3.4 KiB
Python
Raw Normal View History

#!/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()