2015-01-31 3 views
2

я обычно это сделать, если я хотел напечатать Unicode:Проверьте, поддерживает ли stdout unicode?

print("There are ", end="") 
try: 
    print(u"\u221E", end="") # ∞ 
    unicode_support = True 
except UnicodeError: 
    print("infinity", end="") 
    unicode_support = False 
print(" ways to get Unicode wrong.") 

if unicode_support: 
    print(u"\U0001F440 see you have a Unicode font.") 
else: 
    print("You do not have Unicode support.") 

Это не будет работать, если я хочу, чтобы возвращать строку Unicode из метода или что-то подобное, так как Python всегда будет понимать строковые литералы с Unicode в них и выдает эту ошибку только при печати на что-то без поддержки Unicode. Я хочу сделать что-то вроде этого:

import sys as _sys 

UNICODE_SUPPORT = _sys.stdout.unicode_support 

def get_heart(): 
    if UNICODE_SUPPORT: 
     return u"\u2665" # ♥ 
    return "heart" 

print("I{}U".format(get_heart.upper())) 

Я хотел бы эквивалент sys.stdout.supports_unicode быть True, если текущий стандартный вывод поддерживает Unicode еще False.

+0

Проверьте источник библиотеки кликов, я думаю, что эта библиотека обрабатывает эту проблему. –

+0

Все кодировки stdout поддерживают * раздел * стандарта Unicode. Постарайтесь определить, какую часть вам интересны? Например, Latin-1 охватывает первые 256 кодовых точек. –

ответ

1

В основном это хак, но что-то подобное, может быть:

UNICODE_SUPPORT = sys.stdout.encoding in ('UTF-8', 'UTF-16', 'UTF-16LE', 'UTF-16BE', 'UTF-32', 'UTF-32LE', 'UTF32BE') 

Или (кредит Martjin Питерс):

UNICODE_SUPPORT = sys.stdout.encoding.lower().startswith('utf-') 

Проще говоря, Unicode огромный список все символы, используемые в письменном языке по всему миру. В том числе древние языки и многие общие и не очень распространенные символы (U+1F4A9). Каждый элемент в этом списке называется кодовой точкой и идентифицируется рядом.

UTF-8, UTF-16 и UTF-32 является кодированием специально разработан, чтобы иметь возможность кодировать все кодовых точки в последовательность байт. UTF-16 и UTF-32 представляют собой многобайтовые кодировки фиксированного размера, которые существуют как для бай-инов, так и для маленьких-endian.

Юникод, созданный a универсальный, по определению любая кодировка, отличная от UTF-..., поддерживает только подмножество Unicode. cp1252 и iso-8859-15 в качестве такого кодирования, поддерживая (частично) латинское подмножество Unicode.

+0

См., Но моя кодировка '' cp1252'', которая * * поддерживает Unicode, поэтому это не сработает. –

+1

@Reticality Затем вы должны точно определить, что для вас «поддерживает unicode», поскольку «cp1252», очевидно, не имеет сопоставления для большинства кодовых кодов Юникода ... –

+1

'sys.stdout.encoding.lower(). startswith ('utf') '.. –

0
sys.stdout.encoding 

является None, когда нет никакого набора кодирования для него, например при перенаправлении в файл без специальных мер предосторожности, так например print(u'fo\xe0ba') потерпит неудачу (пытаюсь использовать ascii кодирование и отсутствие).

Добавлено: обратите внимание, что большинство кодироаков не «универсальные» - каждый поддерживает только подмножество Юникода. «Поддержка Unicode» - это одно; «Поддерживает все Юникода» (иначе «использует универсальную кодировку») - это другое.

UTF-8 является самым популярным универсальным кодированием, хотя иногда вы можете встретить UTF-16 или даже UTF-32 (лично я никогда не встречал последнего «в дикой природе» :-) ,

Кстати, даже если определенное устройство поддерживает, например, UTF-8, что делает не означает, что будет иметь право глифов в шрифте репертуаре, чтобы отобразить каждую кодовую точку читаема и однозначно - это очень другой выпуск.

+0

«Нет» единственное, что можно вернуть, когда Unicode не поддерживается? (т. е. существуют ли какие-либо кодировки, которые не поддерживают Unicode?) –

+0

@Reticity, несколько кодировок могут поддерживать только ** части ** Юникода - например, 'ISO-8859-1' поддерживает только первые 256 кодовых точек, ascii' только первые 128 единиц и т. д. На самом деле несколько кодировок, таких как 'utf8', являются« универсальными ». Но «Unicode не поддерживается» - это совсем другая проблема! Позвольте мне отредактировать ответ, чтобы прояснить это. –