suwoodblender/encoding_fix.py

111 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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