Konwertuj ciąg znaków Unicode na ciąg znaków w Pythonie (zawierający dodatkowe symbole)

Jak przekonwertować ciąg znaków Unicode (zawierający dodatkowe znaki jak£ $, itp.) w ciąg Pythona?

Author: jfs, 2009-07-30

8 answers

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'
 510
Author: Sorantis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-30 15:44:32

Możesz użyć kodowania do ASCII, jeśli nie musisz tłumaczyć znaków innych niż ASCII:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
 278
Author: Ferran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 04:19:09
>>> text=u'abcd'
>>> str(text)
'abcd'

Jeśli łańcuch zawiera tylko znaki ascii.

 106
Author: igco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-05 15:48:56

Jeśli masz ciąg znaków Unicode i chcesz zapisać go do pliku lub innej postaci serializowanej, musisz najpierw zakodować do określonej reprezentacji, która może być przechowywana. Istnieje kilka popularnych kodowań Unicode, takich jak UTF-16 (używa dwóch bajtów dla większości znaków Unicode) lub UTF-8 (1-4 bajty / punkt kodowy w zależności od znaku), itp. Aby przekonwertować ten ciąg znaków na określone kodowanie, możesz użyć:

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

Ten surowy ciąg bajtów może być zapisany do pliku. Należy jednak pamiętać, że czytając go z powrotem, musisz wiedzieć, w jakim kodowaniu jest i dekodować go za pomocą tego samego kodowania.

Podczas zapisu do plików można pozbyć się tego ręcznego kodowania/dekodowania za pomocą modułu kodeki. Tak więc, aby otworzyć plik, który koduje wszystkie ciągi Unicode do UTF-8 , użyj:

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

Należy pamiętać, że wszystko inne, które używa tych plików, musi zrozumieć, w jakim kodowaniu jest plik, jeśli chcą je przeczytać. Jeśli tylko ty robisz Odczyt/Zapis to nie jest problem, w przeciwnym razie upewnij się, że piszesz w formie zrozumiałej przez cokolwiek innego używa plików.

W Pythonie 3 ta forma dostępu do plików jest domyślna, a wbudowana funkcja open będzie pobierać parametr kodowania i zawsze tłumaczyć na / z Unicode ciągi znaków (domyślny obiekt string w Pythonie 3) dla plików otwartych w trybie tekstowym.

 105
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 04:15:17

Oto przykład:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
 51
Author: Bastien Léonard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-30 15:46:26

Cóż, jeśli chcesz / chcesz przełączyć się na Python 3 (co może nie być spowodowane wsteczną niekompatybilnością z niektórymi kodami Pythona 2), nie musisz wykonywać żadnej konwersji; cały tekst w Pythonie 3 jest reprezentowany przez ciągi Unicode, co oznacza również, że nie ma już użycia składni u'<text>'. Masz również, co w efekcie, ciągi bajtów, które są używane do reprezentowania danych (które mogą być zakodowane string).

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

(Oczywiście, jeśli obecnie używasz Pythona 3, problem prawdopodobnie ma związek z tym, jak próbujesz zapisać tekst do pliku.)

 3
Author: JAB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-30 16:14:33

Oto przykładowy kod

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
 2
Author: Gihan Chathuranga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 07:59:44
import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars
 -1
Author: Arvind Pal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 06:27:54