Как я могу сделать Python 3 (3.1) print("Some text")
для стандартного вывода в UTF-8 или как выводить необработанные байты?
Test.py
TestText = "Test - āĀēĒčČ..šŠūŪžŽ" # this is UTF-8
TestText2 = b"Test2 - \xc4\x81\xc4\x80\xc4\x93\xc4\x92\xc4\x8d\xc4\x8c..\xc5\xa1\xc5\xa0\xc5\xab\xc5\xaa\xc5\xbe\xc5\xbd" # just bytes
print(sys.getdefaultencoding())
print(sys.stdout.encoding)
print(TestText)
print(TestText.encode("utf8"))
print(TestText.encode("cp1252","replace"))
print(TestText2)
Вывод (в CP1257 и я заменил символы на байтовые значения [x00]
):
utf-8
cp1257
Test - [xE2][xC2][xE7][C7][xE8][xC8]..[xF0][xD0][xFB][xDB][xFE][xDE]
b'Test - \xc4\x81\xc4\x80\xc4\x93\xc4\x92\xc4\x8d\xc4\x8c..\xc5\xa1\xc5\xa0\xc5\xab\xc5\xaa\xc5\xbe\xc5\xbd'
b'Test - ??????..\x9a\x8a??\x9e\x8e'
b'Test2 - \xc4\x81\xc4\x80\xc4\x93\xc4\x92\xc4\x8d\xc4\x8c..\xc5\xa1\xc5\xa0\xc5\xab\xc5\xaa\xc5\xbe\xc5\xbd'
print
слишком умный ...: D Нет смысла использовать закодированный текст с print
(так как он всегда показывает только представление байтов, а не реальных байтов), и вообще невозможно вывести байты, потому что все равно печатать и всегда кодирует его в sys.stdout.encoding
.
Например: print(chr(255))
выдает ошибку:
Traceback (most recent call last):
File "Test.py", line 1, in <module>
print(chr(255));
File "H:\Python31\lib\encodings\cp1257.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xff' in position 0: character maps to <undefined>
Между прочим, print( TestText == TestText2.decode("utf8"))
возвращает False
, хотя вывод на печать такой же.
Как Python 3 определяет sys.stdout.encoding
и как я могу его изменить?
Я сделал printRAW()
функцию, которая прекрасно работает (на самом деле она кодирует выходные данные в UTF-8, так что на самом деле это не необработанный ...):
def printRAW(*Text):
RAWOut = open(1, 'w', encoding='utf8', closefd=False)
print(*Text, file=RAWOut)
RAWOut.flush()
RAWOut.close()
printRAW("Cool", TestText)
Вывод (теперь он печатается в UTF-8):
Cool Test - āĀēĒčČ..šŠūŪžŽ
printRAW(chr(252))
также прекрасно печатает ü
(в UTF-8, [xC3][xBC]
) и без ошибок:)
Теперь я ищу, может быть, лучшее решение, если есть ...