Python cp949 에러 해결 차선책: 이모지 없애기
python을 windows app store에서 설치하게 되면 cp949 인코딩으로 기본 실행이 되어버려서 디버깅 로그에 이모지 호환이 어려운 경우가 종종 생깁니다. 다양한 방법으로 해결할 수 있지만, 아예 이모지를 지워버리는 방법도 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- coding: utf-8 -*-
import os
import sys
import re
def extract_emojis_from_text(text):
emoji_pattern = re.compile(
"["
"\U0001f600-\U0001f64f"
"\U0001f300-\U0001f5ff"
"\U0001f680-\U0001f6ff"
"\U0001f1e0-\U0001f1ff"
"\U00002700-\U000027bf"
"\U0001f900-\U0001f9ff"
"\U00002600-\U000026ff"
"\U00002b00-\U00002bff"
"\U0001fa70-\U0001faff"
"\U000025a0-\U000025ff"
"]+",
flags=re.UNICODE,
)
emojis = set("".join(emoji_pattern.findall(text)))
return emojis
def extract_emojis_from_file(filepath):
try:
with open(filepath, encoding="utf-8") as f:
text = f.read()
return extract_emojis_from_text(text)
except Exception as e:
print(f"파일 읽기 실패: {filepath} ({e})")
return set()
def extract_emojis_from_folder(folderpath, exts=None):
emojis = set()
exts = exts or []
for root, _, files in os.walk(folderpath):
for fname in files:
if not exts or any(fname.endswith(ext) for ext in exts):
path = os.path.join(root, fname)
emojis |= extract_emojis_from_file(path)
return emojis
def replace_emojis_in_text(text, emoji_map):
result = text
for emoji, repl in emoji_map.items():
result = result.replace(emoji, repl)
return result
def replace_emojis_in_file(filepath, emoji_map):
try:
with open(filepath, encoding="utf-8") as f:
content = f.read()
new_content = replace_emojis_in_text(content, emoji_map)
if new_content != content:
with open(filepath, "w", encoding="utf-8") as f:
f.write(new_content)
print(f"✅ {filepath} 이모지 대체 완료!")
else:
print(f"ℹ️ {filepath} 변경사항 없음.")
except Exception as e:
print(f"파일 처리 오류: {filepath} ({e})")
def replace_emojis_in_folder(folderpath, emoji_map, exts=None):
exts = exts or []
for root, _, files in os.walk(folderpath):
for fname in files:
if not exts or any(fname.endswith(ext) for ext in exts):
path = os.path.join(root, fname)
replace_emojis_in_file(path, emoji_map)
def main():
print("=== 🕵️♂️ 이모지 추출/치환기 ===")
print("1. 코드 문자열")
print("2. 파일 경로")
print("3. 폴더 경로")
while True:
mode = input("검사할 타입을 선택하세요 (1:코드, 2:파일, 3:폴더, q:종료): ").strip()
if mode.lower() == "q":
print("종료합니다.")
return
if mode not in ["1", "2", "3"]:
print("1, 2, 3 중 선택!")
continue
if mode == "1":
text = input("검사할 코드 문자열을 붙여넣으세요:\n")
emojis = extract_emojis_from_text(text)
elif mode == "2":
path = input("검사할 파일 경로를 입력하세요: ").strip()
if not os.path.isfile(path):
print("파일이 존재하지 않습니다.")
continue
emojis = extract_emojis_from_file(path)
elif mode == "3":
path = input("검사할 폴더 경로를 입력하세요: ").strip()
if not os.path.isdir(path):
print("폴더가 존재하지 않습니다.")
continue
ext_input = input("확장자 목록을 콤마(,)로 구분해 입력 (예: py,md,json) [엔터시 전체]: ").strip()
exts = ["." + e.strip().lstrip(".") for e in ext_input.split(",") if e.strip()] if ext_input else []
emojis = extract_emojis_from_folder(path, exts)
else:
emojis = set()
if not emojis:
print("이모지를 찾지 못했습니다!\n")
continue
print("\n=== 🎯 찾은 이모지 ===")
emoji_map = {}
for e in sorted(emojis):
repl = input(f"이모지 [{e}] → 어떤 문자로 대체할까요? (엔터=삭제): ")
emoji_map[e] = repl
print("=====================\n")
# 실제 치환 적용
if mode == "1":
new_text = replace_emojis_in_text(text, emoji_map)
print("=== 📝 대체 결과 ===")
print(new_text)
print("===================")
elif mode == "2":
replace_emojis_in_file(path, emoji_map)
elif mode == "3":
replace_emojis_in_folder(path, emoji_map, exts)
print("")
if __name__ == "__main__":
main()
(참고): cp949는 한국어도 출력 안되서 지워줘야 합니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
