# πŸ”€ 인코딩 κ°€μ΄λ“œ (필독!) > ⚠️ **μ€‘μš”**: ν•œκΈ€ 데이터 처리 μ‹œ λ°˜λ“œμ‹œ 이 κ°€μ΄λ“œλ₯Ό λ”°λ₯Ό 것 --- ## βœ… ν˜„μž¬ μ„€μ • (2025-06-30 적용됨) ``` ν™˜κ²½λ³€μˆ˜: PYTHONIOENCODING=utf-8 (User 레벨) ``` 이 μ„€μ •μœΌλ‘œ λͺ¨λ“  Python μŠ€ν¬λ¦½νŠΈμ—μ„œ UTF-8 좜λ ₯이 κΈ°λ³Έ μ μš©λ©λ‹ˆλ‹€. --- ## πŸ“‹ 문제 상황 ### 증상 ``` DB μ‹€μ œ κ°’: "μ•ˆν…”λ―Όλ½€μ‚" μ½˜μ†” 좜λ ₯: "μ•ˆν…”λ―Όμ‚¬μ‚¬" ← κΉ¨μ Έμ„œ λ‹€λ₯Έ κΈ€μžλ‘œ λ³΄μž„! ``` ### 원인 ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DB (UTF-8) β”‚ ──► β”‚ Python β”‚ ──► β”‚ Windows μ½˜μ†” β”‚ β”‚ "뽀삐" β”‚ β”‚ stdout β”‚ β”‚ (CP949) β”‚ β”‚ U+BF40 β”‚ β”‚ β”‚ β”‚ "사사" β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↑ 인코딩 λ³€ν™˜ μ‹€νŒ¨! ``` - Windows μ½˜μ†” κΈ°λ³Έ 인코딩: **CP949** (ν•œκ΅­μ–΄ μ™„μ„±ν˜•) - CP949μ—μ„œ μ§€μ›ν•˜μ§€ μ•Šκ±°λ‚˜ λ‹€λ₯΄κ²Œ λ§€ν•‘λ˜λŠ” μœ λ‹ˆμ½”λ“œ 문자 쑴재 - "뽀삐" 같은 κΈ€μžκ°€ "사사"둜 잘λͺ» ν‘œμ‹œλ¨ --- ## βœ… ν•΄κ²°μ±… ### 1. 슀크립트 상단에 인코딩 μ„€μ • μΆ”κ°€ (ν•„μˆ˜!) ```python # -*- coding: utf-8 -*- import sys import io # stdout을 UTF-8둜 κ°•μ œ μ„€μ • sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') ``` ### 2. ν™˜κ²½λ³€μˆ˜ μ„€μ • (ꢌμž₯) ```powershell # PowerShellμ—μ„œ μ‹€ν–‰ μ „ μ„€μ • $env:PYTHONIOENCODING = "utf-8" # λ˜λŠ” μ‹œμŠ€ν…œ ν™˜κ²½λ³€μˆ˜λ‘œ 영ꡬ μ„€μ • [Environment]::SetEnvironmentVariable("PYTHONIOENCODING", "utf-8", "User") ``` ### 3. Windows Terminal UTF-8 λͺ¨λ“œ ```powershell # μ½˜μ†” μ½”λ“œνŽ˜μ΄μ§€λ₯Ό UTF-8둜 λ³€κ²½ chcp 65001 ``` ### 4. JSON 좜λ ₯ μ‚¬μš© (κ°€μž₯ μ•ˆμ „) ```python import json # μ½˜μ†” 좜λ ₯ λŒ€μ‹  JSON으둜 λ°˜ν™˜ result = { "product_name": "μ•ˆν…”λ―Όλ½€μ‚", "apc": "0230237010107" } print(json.dumps(result, ensure_ascii=False, indent=2)) ``` --- ## πŸ“ 슀크립트 ν…œν”Œλ¦Ώ λͺ¨λ“  DB 쑰회 μŠ€ν¬λ¦½νŠΈλŠ” 이 ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•  것: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- """ 슀크립트 μ„€λͺ… """ import sys import io import json # ═══════════════════════════════════════════════════════════ # 인코딩 μ„€μ • (Windows CP949 문제 λ°©μ§€) # ═══════════════════════════════════════════════════════════ sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') # ═══════════════════════════════════════════════════════════ # 메인 둜직 # ═══════════════════════════════════════════════════════════ def main(): # ... 둜직 ... # κ²°κ³ΌλŠ” JSON으둜 좜λ ₯ (κ°€μž₯ μ•ˆμ „) result = {"data": [...]} print(json.dumps(result, ensure_ascii=False, indent=2)) if __name__ == '__main__': main() ``` --- ## πŸ”§ κΈ°μ‘΄ 슀크립트 μˆ˜μ • λͺ©λ‘ | 슀크립트 | μƒνƒœ | μˆ˜μ • ν•„μš” | |----------|------|-----------| | `scripts/query_mileage.py` | ⚠️ | 인코딩 μ„€μ • μΆ”κ°€ | | `scripts/query_sales.py` | ⚠️ | 인코딩 μ„€μ • μΆ”κ°€ | | `scripts/query_aniparm.py` | ⚠️ | 인코딩 μ„€μ • μΆ”κ°€ | | `scripts/search_mssql.py` | ⚠️ | 인코딩 μ„€μ • μΆ”κ°€ | | `scripts/check_*.py` | ⚠️ | 인코딩 μ„€μ • μΆ”κ°€ | --- ## πŸ§ͺ ν…ŒμŠ€νŠΈ 방법 ```python # 인코딩 ν…ŒμŠ€νŠΈ 슀크립트 # -*- coding: utf-8 -*- import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') test_words = ["뽀삐", "ν‚Ή", "μ•ˆν…”λ―Όλ½€μ‚(5kgμ΄ν•˜)", "λ‹€μ΄λ‘œν•˜νŠΈμ •M(12~22kg)"] for word in test_words: print(f"원본: {word}") print(f"μœ λ‹ˆμ½”λ“œ: {[f'U+{ord(c):04X}' for c in word]}") print() ``` --- ## ⚠️ μ£Όμ˜μ‚¬ν•­ 1. **μ ˆλŒ€ CP949 좜λ ₯을 λ―Ώμ§€ 말 것** - κΉ¨μ§„ κΈ€μžκ°€ λ‹€λ₯Έ κΈ€μžλ‘œ 보일 수 있음 2. **DB 데이터 확인 μ‹œ** - 직접 DB 툴둜 ν™•μΈν•˜κ±°λ‚˜ JSON 좜λ ₯ μ‚¬μš© 3. **AI 뢄석 μ‹œ** - μœ λ‹ˆμ½”λ“œ μ½”λ“œν¬μΈνŠΈλ‘œ 확인 (U+XXXX) 4. **λ§€ν•‘ μž‘μ—… μ‹œ** - λ°˜λ“œμ‹œ μ–‘μͺ½ DB 직접 확인 ν›„ μ§„ν–‰ --- *μž‘μ„±μΌ: 2025-06-30* *μ‚¬μœ : "뽀삐"κ°€ "사사"둜 잘λͺ» ν‘œμ‹œλ˜λŠ” 인코딩 문제 λ°œμƒ*