1
# what I currently have 

print('你好') 

# 你好 

# this is what I want 

print('你好') 

# \uXXXX \uXXXX 

Как мне это сделать? Я хочу, чтобы напечатать все символы не-ASCII в строках как юникода эвакуационных литераловКак печатать не-ASCII символы, как ихххх

+0

@jDo Что в имени бога являются вы даже говорите? – AlanSTACK

+1

Строки в Python 3 должны использовать utf-8 по умолчанию. Правильное исправление заключается в том, чтобы выяснить, почему ваша строка находится в ASCII, а не utf-8 и исправлена ​​это. – Carpetsmoker

+0

@ Алан да, я не знаю. Я удалю этот бесполезный комментарий: D Но не могли бы вы все еще использовать обработку исключений таким образом и просто заменить немой оператор печати чем-то другим? (при условии, что вы не хотите исправлять ошибку кодирования, как предлагает Carpetsmoker) – jDo

ответ

8

Вы можете преобразовать строки в отладочном представления с не-ASCII, непечатные символы преобразуются в управляющие последовательности с использованием ascii() function:

Как repr(), верните строку, содержащую печатаемое представление объекта, но избегайте символов, отличных от ASCII, в строке, возвращаемой repr(), с использованием , \u или \U экранов.

Для кодовых точек Unicode в диапазоне U + 0100-U + FFFF используется \uhhhh escapes; для диапазона Latin-1 (U + 007F-U + 00FF) \xhh вместо этого используются escape-последовательности. Обратите внимание, что вывод квалифицируется как допустимый синтаксис Python, чтобы заново создать строку, так что котировки включены:

>>> print('你好') 
你好 
>>> print(ascii('你好')) 
'\u4f60\u597d' 
>>> print(ascii('ASCII is not changed, Latin-1 (åéîøü) is, as are all higher codepoints, such as 你好')) 
'ASCII is not changed, Latin-1 (\xe5\xe9\xee\xf8\xfc) is, as are all higher codepoints, such as \u4f60\u597d' 

Если необходимо иметь \uhhhh за все, что вам придется сделать свой собственный переоборудованию:

import re 

def escape_unicode(t, _p=re.compile(r'[\u0080-\U0010ffff]')): 
    def escape(match): 
     char = ord(match.group()) 
     return '\\u{:04x}'.format(char) if char < 0x10000 else '\\U{:08x}'.format(char) 
    return _p.sub(escape, t) 

выше функция не не добавить кавычки как функция ascii() делает:

>>> print(escape_unicode('你好')) 
\u4f60\u597d 
>>> print(escape_unicode('ASCII is not changed, Latin-1 (åéîøü) is, as are all higher codepoints, such as 你好')) 
ASCII is not changed, Latin-1 (\u00e5\u00e9\u00ee\u00f8\u00fc) is, as are all higher codepoints, such as \u4f60\u597d 
+0

можно ли заставить все «\ uXXXX» для стандартизации? – AlanSTACK

+3

@Alan: не с функцией 'ascii()'. Тогда вам придется делать это вручную. Заметим также, что для чего-либо вне BMP (кодовых точек над U + FFFF) вам придется использовать нотацию '\ Uhhhhhhhh' в Python. Какую проблему ты пытаешься решить? –

2

Обратите внимание, что без замены \ с \\, то, что вы хотите, не обратимо; например. вы не можете знать, была ли фактическая строка '好' (один символ) или '\\u597d' (6 символов в диапазоне ascii), так как оба будут производить вывод \u597d. Предложение Martijn делает обратную косую черту замены и обратимо.

Вы можете просто сделать преобразование сами:

def unicodeescape(s): 
    return ''.join(c if ord(c) < 128 else '\\u%04x' % ord(c) for c in s) 

print(unicodeescape('你好')) 

(применяется до сих пор нота Мартейн в о символах вне BMP)

Если вы хотите сделать это, чтобы все ваши результаты программы, и пытается запомнить чтобы передать все через функцию преобразования не кажется, как ваша идея хорошо провести время, вы можете попробовать что-то вроде этого:

import codecs, sys 

def unicodeescapereplace(error): 
    if isinstance(error, UnicodeEncodeError): 
     s = error.object[error.start:error.end] 
     repl = ''.join('\\u%04x' % ord(c) for c in s) 
     return (repl, error.end) 
    raise error 

codecs.register_error('unicodeescapereplace', unicodeescapereplace) 
sys.stdout = codecs.getwriter('ascii')(sys.stdout.buffer, 'unicodeescapereplace') 

print('你好') 

T он создает собственный обработчик ошибок кодирования, который обрабатывает UnicodeEncodeErrors, заменяя оскорбительного символа побегом в unicode. Вы можете использовать его как '你好'.encode('ascii', 'unicodeescapereplace'), или, как в примере выше, замените stdout на тот, который автоматически использует его для всей кодировки.

1

Нормальное представление получается с помощью встроенного в ascii объяснения от Martijn Pieters.

Если вы действительно хотите constently напечатать \ и убегает, вы можете сделать это вручную:

t = 'ASCII is not changed, Latin-1 (åéîøü) is, as are all higher codepoints, such as 你好' 
disp = u = "'" + ''.join([c if (ord(c) < 128) else r'\u%04x' % (ord(c),) for c in t ]) + "'" 
print(disp) 
print(eval(disp)) 

дает, как и ожидалось:

'ASCII is not changed, Latin-1 (\u00e5\u00e9\u00ee\u00f8\u00fc) is, as are all higher codepoints, such as \u4f60\u597d' 
ASCII is not changed, Latin-1 (åéîøü) is, as are all higher codepoints, such as 你好 

NB: Я знаю, что Eval является зло, но в этом конкретном случае использования я знаю, что внутренняя строка не содержит ' и что она заключена в ', поэтому она не может быть просто преобразованием кодированных символов, но я никогда не сделаю этого на внешнем Строка без по крайней мере тестирования t.contains("'") ...

NB2: этот метод не может корректно обрабатывать символы, чьи коды больше 0xFFFF - ему потребуется еще один если еще ...

Смежные вопросы