W pliku tekstowym znajduje się ciąg „Nie podoba mi się to”.
Jednak kiedy wczytuję go do ciągu, staje się „Nie tak \ xe2 \ x80 \ x98t”. Rozumiem, że \ u2018 to symbol „” ”w formacie Unicode. używam
f1 = open (file1, "r")
text = f1.read()
polecenie wykonania odczytu.
Czy jest możliwe odczytanie ciągu w taki sposób, że kiedy jest wczytywany do łańcucha, brzmi to „Nie podoba mi się to” zamiast „Nie tak \ xe2 \ x80 \ x98t w ten sposób”?
Druga edycja: widziałem, jak niektórzy ludzie używają mapowania do rozwiązania tego problemu, ale czy naprawdę nie ma wbudowanej konwersji, która dokonuje tego rodzaju konwersji ANSI na Unicode (i odwrotnie)?
Odpowiedzi:
Ref: http://docs.python.org/howto/unicode
Odczytywanie Unicode z pliku jest zatem proste:
Możliwe jest również otwieranie plików w trybie aktualizacji, umożliwiając zarówno odczyt, jak i zapis:
EDYCJA : Zakładam, że twoim zamierzonym celem jest po prostu możliwość prawidłowego odczytania pliku do ciągu w Pythonie. Jeśli próbujesz przekonwertować na ciąg ASCII z Unicode, to naprawdę nie ma bezpośredniego sposobu, aby to zrobić, ponieważ znaki Unicode niekoniecznie muszą istnieć w ASCII.
Jeśli próbujesz przekonwertować na ciąg ASCII, wypróbuj jedną z następujących czynności:
Zastąp określone znaki Unicode odpowiednikami ASCII, jeśli chcesz obsłużyć tylko kilka specjalnych przypadków, takich jak ten konkretny przykład
Użyj
unicodedata
modułunormalize()
istring.encode()
metody, aby przekonwertować najlepiej jak potrafisz na najbliższy odpowiednik ASCII (zob. Https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting- unicode-to-ascii-using-python ):źródło
codecs
moduł nie obsługuje poprawnie trybu uniwersalnych znaków nowej linii.io.open()
Zamiast tego użyj w Pythonie 2.7+ (jest wbudowanyopen()
w Python 3).Należy wziąć pod uwagę kilka kwestii.
Znak \ u2018 może pojawić się tylko jako fragment reprezentacji ciągu znaków Unicode w Pythonie, np. Jeśli napiszesz:
Teraz, jeśli chcesz po prostu ładnie wydrukować ciąg znaków Unicode, po prostu użyj
encode
metody Unicode :Aby upewnić się, że każda linia z dowolnego pliku zostanie odczytana jako Unicode, lepiej użyj
codecs.open
funkcji zamiast po prostuopen
, która pozwala określić kodowanie pliku:źródło
Ale tak naprawdę brzmi „Nie podoba mi się to”, a nie „Nie podoba mi się to”. Znak u '\ u2018' to zupełnie inny znak niż "'" (i wizualnie powinien bardziej odpowiadać' '').
Jeśli próbujesz przekonwertować zakodowany Unicode na zwykły ASCII, być może możesz zachować mapowanie znaków interpunkcyjnych Unicode, które chciałbyś przetłumaczyć na ASCII.
Jednak w Unicode jest bardzo dużo znaków interpunkcyjnych , ale przypuszczam, że możesz liczyć na to, że tylko kilka z nich jest faktycznie używanych przez dowolną aplikację, która tworzy czytane dokumenty.
źródło
Możliwe jest również odczytanie zakodowanego pliku tekstowego za pomocą metody odczytu Pythona 3:
W przypadku tej odmiany nie ma potrzeby importowania żadnych dodatkowych bibliotek
źródło
Pomijając fakt, że twój plik tekstowy jest uszkodzony (U + 2018 to lewy cudzysłów, a nie apostrof): iconv można używać do transliteracji znaków Unicode na ascii.
Będziesz musiał wyszukać w Google „iconvcodec”, ponieważ moduł wydaje się nie być już obsługiwany i nie mogę znaleźć dla niego kanonicznej strony głównej.
Alternatywnie możesz użyć
iconv
narzędzia wiersza poleceń, aby wyczyścić plik:źródło
Istnieje możliwość, że w jakiś sposób masz ciąg znaków inny niż Unicode ze znakami ucieczki Unicode, np .:
To mi się kiedyś przytrafiło. Możesz użyć
unicode_escape
kodeka, aby zdekodować ciąg do Unicode, a następnie zakodować go w dowolnym formacie:źródło
To jest sposób, w jaki Python pokazuje ciągi zakodowane w Unicode. Ale myślę, że powinieneś być w stanie wydrukować ciąg na ekranie lub zapisać go do nowego pliku bez żadnych problemów.
źródło
W rzeczywistości U + 2018 jest reprezentacją Unicode znaku specjalnego ''. Jeśli chcesz, możesz przekonwertować wystąpienia tego znaku na U + 0027 za pomocą tego kodu:
Ponadto, czego używasz do zapisywania pliku?
f1.read()
powinien zwrócić ciąg, który wygląda następująco:Jeśli zwraca ten ciąg, plik jest zapisywany nieprawidłowo:
źródło