58 lines
1.7 KiB
Python
Executable File
58 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Windows compatibility utilities for ClaudeKit scripts.
|
|
|
|
Provides UTF-8 encoding support for Windows console (cp1252).
|
|
Import this module early in scripts that output Unicode content.
|
|
|
|
Usage:
|
|
# At top of script, after imports:
|
|
from win_compat import safe_print, ensure_utf8_stdout
|
|
|
|
# Option 1: Wrap stdout globally (recommended for scripts with many prints)
|
|
ensure_utf8_stdout()
|
|
print("Unicode content: emojis, symbols, etc.")
|
|
|
|
# Option 2: Use safe_print for individual calls
|
|
safe_print("Unicode content: emojis, symbols, etc.")
|
|
"""
|
|
|
|
import sys
|
|
|
|
_stdout_wrapped = False
|
|
|
|
|
|
def ensure_utf8_stdout():
|
|
"""Wrap sys.stdout to use UTF-8 encoding on Windows.
|
|
|
|
Safe to call multiple times - only wraps once.
|
|
Call this early in script execution, before any print() calls.
|
|
"""
|
|
global _stdout_wrapped
|
|
if _stdout_wrapped:
|
|
return
|
|
|
|
if sys.platform == 'win32':
|
|
import io
|
|
# Only wrap if stdout has a buffer (not already wrapped)
|
|
if hasattr(sys.stdout, 'buffer'):
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
|
|
|
_stdout_wrapped = True
|
|
|
|
|
|
def safe_print(text):
|
|
"""Print with Unicode fallback for Windows cp1252 console.
|
|
|
|
Use this for individual print calls when you can't wrap stdout globally.
|
|
Falls back to replacing unencodable characters with '?'.
|
|
|
|
Args:
|
|
text: String to print (can contain any Unicode characters)
|
|
"""
|
|
try:
|
|
print(text)
|
|
except UnicodeEncodeError:
|
|
# Fallback: replace unencodable chars
|
|
encoding = getattr(sys.stdout, 'encoding', 'utf-8') or 'utf-8'
|
|
print(text.encode(encoding, errors='replace').decode(encoding))
|