/ / Windows cmd पर असमर्थित यूनिकोड वर्णों को कैसे प्रिंट करें अपवाद बढ़ाने के बजाय "?"? - अजगर, खिड़कियां, पायथन-3.x, यूनिकोड, cmd

Windows cmd पर असमर्थित यूनिकोड वर्णों को उदाहरण के रूप में कैसे मुद्रित करें अपवाद बढ़ाने के बजाय "?"? - अजगर, खिड़कियां, पायथन-3.x, यूनिकोड, cmd

यदि एक यूनिकोड वर्ण (कोड पॉइंट) जो Windows cmd द्वारा असमर्थित है, उदा। एन दास "-" Windows cmd टर्मिनल में पाइथन 3 के साथ मुद्रित किया गया है:

print("u2013")

फिर एक अपवाद उठाया जाता है:

UnicodeEncodeError: "charmap" कोडेक स्थिति 0 में "एन्कोड वर्ण" u2013 "कर सकता है: चरित्र मानचित्र <अपरिभाषित>

बनाने का कोई तरीका है print असमर्थित वर्णों को उदा। "?", या अन्यथा संभाल लें print निष्पादन जारी रखने की अनुमति देने के लिए?

उत्तर:

उत्तर № 1 के लिए 4

अद्यतन करें

एक बेहतर तरीका है ... नीचे देखें।


एक बेहतर तरीका होना चाहिए, लेकिन इस समय मैं यही सोच सकता हूं:

print("u2013".encode(errors="replace").decode())

यह उपयोग करता है encode() यूनिकोड स्ट्रिंग को एन्कोड करने के लिए जो भी आपका डिफ़ॉल्ट एन्कोडिंग है, उस अक्षर को "प्रतिस्थापित करना" जो उस एन्कोडिंग के लिए मान्य नहीं है ?। यह स्ट्रिंग को ए में परिवर्तित करता है bytes स्ट्रिंग, ताकि फिर यूनिकोड में परिवर्तित हो जाए, प्रतिस्थापित वर्णों को संरक्षित किया जा सके।

यहां एक कोड बिंदु का उपयोग करके एक उदाहरण दिया गया है जो GBK एन्कोडिंग में मान्य नहीं है:

>>> s = "abcu3020def"
>>> print(s)
s.abc〠def
>>> s.encode(encoding="gbk")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: "gbk" codec can"t encode character "u3020" in position 3: illegal multibyte sequence

>>> s.encode(encoding="gbk", errors="replace")
b"abc?def"
>>> s.encode(encoding="gbk", errors="replace").decode()
"abc?def"

>>> print(s.encode(encoding="gbk", errors="replace").decode())
abc?def

अद्यतन करें

तो @eryksun द्वारा वर्णित एक बेहतर तरीका हैटिप्पणियों में एक बार स्थापित होने पर असमर्थित चरित्र प्रतिस्थापन को प्रभावित करने के लिए किसी भी कोड को बदलने की आवश्यकता नहीं है। नीचे दिया गया कोड व्यवहार से पहले और बाद में प्रदर्शित होता है (मैंने जीबीके में अपना पसंदीदा एन्कोडिंग सेट किया है):

>>> import os, sys
>>> print("u3030")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: "gbk" codec can"t encode character "u3030" in position 0: illegal multibyte sequence

>>> old_stdout = sys.stdout
>>> fd = os.dup(sys.stdout.fileno())
>>> sys.stdout = open(fd, mode="w", errors="replace")
>>> old_stdout.close()

>>> print("u3030")
?

उत्तर № 2 के लिए 1

@eryksun टिप्पणी विंडोज पर्यावरण चर निर्दिष्ट करने का उल्लेख है:

PYTHONIOENCODING=:replace

"प्रतिस्थापन" से पहले ":" पर ध्यान दें। यह एक प्रयोग योग्य उत्तर की तरह दिखता है जिसके लिए पाइथन स्क्रिप्ट का उपयोग करके किसी भी बदलाव की आवश्यकता नहीं होती है print.

The print("u2013") परिणाम:

?

तथा print("Hellou2013world!") परिणाम:

नमस्ते? दुनिया!