Converteer een Unicode-tekenreeks naar een tekenreeks in Python (met extra symbolen)

Hoe converteert u een Unicode-tekenreeks (met extra tekens zoals £ $, enz.) naar een Python-tekenreeks?


Antwoord 1, autoriteit 100%

Zie 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'

Antwoord 2, autoriteit 55%

U kunt coderen naar ASCII gebruiken als u de niet-ASCII-tekens niet hoeft te vertalen:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>

Antwoord 3, autoriteit 25%

>>> text=u'abcd'
>>> str(text)
'abcd'

Als de tekenreeks alleen ascii-tekens bevat.


Antwoord 4, autoriteit 20%

Als je een Unicode-tekenreeks hebt en je wilt deze naar een bestand of een andere geserialiseerde vorm schrijven, moet je deze eerst coderenin een bepaalde representatie die kan worden opgeslagen. Er zijn verschillende veelvoorkomende Unicode-coderingen, zoals UTF-16 (gebruikt twee bytes voor de meeste Unicode-tekens) of UTF-8 (1-4 bytes / codepunt afhankelijk van het teken), enz. Om die tekenreeks om te zetten in een bepaalde codering, moet u kan gebruiken:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

Deze onbewerkte reeks bytes kan naar een bestand worden geschreven. Houd er echter rekening mee dat u bij het teruglezen moet weten in welke codering het is en het decoderen met dezelfde codering.

Als u naar bestanden schrijft, kunt u dit handmatige coderings-/decoderingsproces verwijderen door de codecs te gebruiken -module. Dus om een bestand te openen dat alle Unicode-strings codeert in UTF-8, gebruik je:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

Houd er rekening mee dat al het andere dat deze bestanden gebruikt, moet begrijpen in welke codering het bestand zich bevindt als ze ze willen lezen. Als u de enige bent die het lezen/schrijven doet, is dit geen probleem, zorg er anders voor dat u in een vorm schrijft die begrijpelijk is voor al het andere dat de bestanden gebruikt.

In Python 3 is deze vorm van bestandstoegang de standaard, en de ingebouwde functie openzal een coderingsparameter nemen en altijd vertalen van/naar Unicode-tekenreeksen (het standaardtekenreeksobject in Python 3) voor bestanden die in tekstmodus zijn geopend.


Antwoord 5, autoriteit 10%

Hier is een voorbeeld:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

Antwoord 6

bestand bevat unicode-esaped string

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",

voor mij

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'

Antwoord 7

Nou, als je bereid/klaar bent om over te schakelen naar Python 3 (wat misschien niet te wijten is aan de achterwaartse incompatibiliteit met sommige Python 2-code), hoef je niets te converteren; alle tekst in Python 3 wordt weergegeven met Unicode-tekenreeksen, wat ook betekent dat er geen gebruik meer wordt gemaakt van de syntaxis u'<text>'. Je hebt ook wat in feite strings van bytes zijn, die worden gebruikt om gegevens weer te geven (wat een gecodeerde string kan zijn).

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-inplace-of-unicode-vs-8-bit

(Als u momenteel Python 3 gebruikt, heeft het probleem waarschijnlijk te maken met de manier waarop u probeert de tekst in een bestand op te slaan.)


Antwoord 8

Hier is een voorbeeldcode

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')

Antwoord 9

Er is een bibliotheek die kan helpen met Unicode-problemen, genaamd ftfy. Heeft mijn leven gemakkelijker gemaakt.

Voorbeeld 1

import ftfy
print(ftfy.fix_text('ünicode'))
output -->
ünicode

Voorbeeld 2 – UTF-8

import ftfy
print(ftfy.fix_text('\xe2\x80\xa2'))
output -->
•

Voorbeeld 3 – Unicode
codepunt

import ftfy
print(ftfy.fix_text(u'\u2026'))
output -->
…

https://ftfy.readthedocs.io/en/latest/

pip install ftfy

https://pypi.org/project/ftfy/


Antwoord 10

Geen enkel antwoord werkte voor mijn geval, waar ik een stringvariabele had met unicode-tekens, en geen enkele encode-decode die hier wordt uitgelegd, deed het werk.

Als ik dat in een Terminal doe

echo "no me llama mucho la atenci\u00f3n"

of

python3
>>> print("no me llama mucho la atenci\u00f3n")

De uitvoer is correct:

output: no me llama mucho la atención

Maar werken met scripts die deze tekenreeksvariabele laadt, werkte niet.

Dit heeft in mijn geval gewerkt, voor het geval iemand er iets aan heeft:

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

Other episodes