Как заставить python 3 print () utf8

Как я могу заставить python 3 (3.1) печатать (" Некоторый текст ") на стандартный вывод в 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 (последний вызов последнего):
 Файл "Test.py", строка 1, в 
 печати (CHR (255));
 Файл "H: \ Python31 \ lib \ encodings \ cp1257.py", строка 19, в кодировке
 вернуть codecs.charmap_encode (входные данные, self.errors, encoding_table) [0]
UnicodeEncodeError: кодек 'charmap' не может кодировать символ '\ xff' в позиции 0: символ отображается на 

Между прочим, 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] ) и без ошибок:)

Теперь я ищу, может быть, лучшее решение, если есть ...

43
задан Toby Speight 14 March 2017 в 18:33
поделиться

2 ответа

Во-первых, исправление:

TestText = "Test - āĀēĒčČ..šŠūŪžŽ" # this NOT utf-8...it is a Unicode string in Python 3.X.
TestText2 = TestText.encode('utf8') # THIS is "just bytes" in UTF-8.

Теперь, чтобы отправить UTF-8 на стандартный вывод, независимо от кодировки консоли, используйте правильный инструмент для работы:

import sys
sys.stdout.buffer.write(TestText2)

"буфер" - это необработанный интерфейс для stdout.

56
ответ дан 26 November 2019 в 22:57
поделиться

Это лучшее, что я могу вытащить из руководства, и это немного грязный хак:

utf8stdout = open(1, 'w', encoding='utf-8', closefd=False) # fd 1 is stdout
print(whatever, file=utf8stdout)

Похоже, что у файловых объектов должен быть метод для изменения их кодировки, но AFAICT нет ни одного.

Если вы пишете в utf8stdout, а затем записываете в sys.stdout без предварительного вызова utf8stdout.flush() или наоборот, могут произойти плохие вещи.

15
ответ дан 26 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: