Як перетворити рядок Unicode (містить зайві символи, такі як £ $ тощо) у рядок Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Як перетворити рядок Unicode (містить зайві символи, такі як £ $ тощо) у рядок Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Відповіді:
Подивитися unicodedata.normalize
title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
'Kluft skrams infor pa federal electoral groe'
unicode
рядок у a str
- це скинути або перетворити символи, які не можуть бути представлені в ASCII. Тож +1 від мене.
type(title) == unicode and type(title.encode('utf-8')) == str
. Не потрібно пошкоджувати вхід, щоб отримати атестатор, який можна зберегти у файл.
Ви можете використовувати кодування для ASCII, якщо вам не потрібно перекладати символи, що не належать до ASCII:
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
ignore
протиreplace
a.encode('ascii', 'xmlcharrefreplace')
дає 'aaaàçççñññ'
.
type(a)
знаходиться str
в Python 3.6.8 і не має жодного encode()
методу.
>>> text=u'abcd'
>>> str(text)
'abcd'
Якщо рядок містить лише символи ascii.
Якщо у вас є рядок Unicode, і ви хочете записати це у файл або іншу серіалізовану форму, ви повинні спочатку закодувати його у певне представлення, яке може зберігатися. Існує кілька загальних кодувань Unicode, таких як UTF-16 (використовує два байти для більшості символів Unicode) або UTF-8 (1-4 байти / кодова точка залежно від символу) тощо. Щоб перетворити цей рядок у певне кодування, ви може використовувати:
>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'
Цей необроблений рядок байтів можна записати у файл. Однак зауважте, що, читаючи його назад, ви повинні знати, що таке кодування, і декодувати його за допомогою того самого кодування.
Записуючи у файли, ви можете позбутися цього ручного процесу кодування / декодування за допомогою модуля кодеків . Отже, щоб відкрити файл, який кодує всі рядки Unicode в UTF-8 , використовуйте:
import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string) # Stored on disk as UTF-8
Зауважте, що все, що використовує ці файли, повинно розуміти, у чому кодування файл, якщо вони хочуть їх прочитати. Якщо ви єдиний, хто займається читанням / записом, це не проблема, інакше переконайтеся, що ви пишете у формі, зрозумілій будь-яким іншим файлам.
У Python 3 ця форма доступу до файлів є типовою, і вбудована open
функція буде приймати параметр кодування і завжди переводити в / з рядків Unicode (об'єкт рядка за замовчуванням у Python 3) для файлів, відкритих у текстовому режимі.
Ось приклад:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
utf8
як показано тут, результат - лише знаки запитання? Ось зображення мого Python, версія 2.7.13. (Я можу кодувати інші об’єкти unicode, такі як u"Klüft"
, але не євро?)
Ну, якщо ви готові / готові перейти на Python 3 (що, можливо, не пов’язано із зворотною несумісністю з деяким кодом Python 2), вам не доведеться робити перетворення; весь текст в Python 3 представлений рядками Unicode, що також означає, що більше не використовується u'<text>'
синтаксис. У вас також є рядки байтів, які використовуються для представлення даних (які можуть бути закодованим рядком).
http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
(Звичайно, якщо ви зараз використовуєте Python 3, проблема, ймовірно, пов'язана з тим, як ви намагаєтеся зберегти текст у файл.)
Ось приклад коду
import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
Файл містить рядок, урізаний unicode
\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",
для мене
f = open("56ad62-json.log", encoding="utf-8")
qq=f.readline()
print(qq)
{"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}
(qq.encode().decode("unicode-escape").encode().decode("unicode-escape"))
# '{"log":"message": "Авторизация пользователя"}\n'
result.encode().decode('unicode-escape')
У моєму випадку не працювало жодної анкети, де я мав змінну рядків, що містить символи unicode, і жодне кодування-декодування, пояснене тут, не спрацювало.
Якщо я буду в терміналі
echo "no me llama mucho la atenci\u00f3n"
або
python3
>>> print("no me llama mucho la atenci\u00f3n")
Вихід правильний:
output: no me llama mucho la atención
Але робота зі сценаріями, що завантажують цю рядкову змінну, не працювала.
Це те, що працювало на моєму випадку , якщо хтось допомагає:
string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención
print type(unicode_string), repr(unicode_string)
Python 3.x:print type(unicode_string), ascii(unicode_string)
Потім відредагуйте своє запитання та скопіюйте / вставте результати вищезгаданого виписки про друк. НЕ повторюйте результати. Також знайдіть у верхній частині свого HTML-коду і побачите, чи можете ви знайти щось подібне: <meta http-equiv = "Content-Type" content = "text / html; charset = iso-8859