Jak pracować z Unicode w Pythonie

Photo of author

By maciekx

Wprowadzenie

Unicode to wszechstronny standard kodowania znaków, umożliwiający reprezentację symboli z różnorodnych języków i systemów pisma. Python, dzięki wbudowanej obsłudze Unicode, stanowi doskonałe narzędzie do manipulacji tekstem o zasięgu globalnym. W tym artykule omówimy szczegółowo zagadnienia związane z Unicode w Pythonie, w tym kodowanie, dekodowanie, normalizację oraz inne istotne aspekty.

Kodowanie Unicode

Unicode bazuje na sekwencji liczb całkowitych, określanych mianem „punktów kodowych”. Każdy znak posiada przypisany unikatowy punkt kodowy, który określa jego reprezentację. W Pythonie punkty kodowe Unicode mogą być przedstawiane jako obiekty typu int lub str:


# Punkt kodowy ASCII litery "a"
punkt_kodowy_a = 97
# Unicode litery "a"
znak_a = "a"

Konwersja pomiędzy obiektami str a punktami kodowymi Unicode jest możliwa za pomocą funkcji ord() (z tekstu na punkt kodowy) oraz chr() (z punktu kodowego na znak):


# Punkt kodowy ASCII litery "b"
punkt_kodowy_b = ord("b")
# Unicode litery "b"
znak_b = chr(98)

Dekodowanie Unicode

Tekst zakodowany w Unicode może zostać odczytany z powrotem do formy tekstowej przy pomocy funkcji decode(). Funkcja ta wymaga podania zestawu kodowania, który określa, jak ciąg bajtów należy przełożyć na punkty kodowe Unicode:


# Zakodowany tekst Unicode
zakodowany_tekst = b"\u0061\u0062\u0063"
# Dekodowanie przy użyciu UTF-8
dekodowany_tekst = zakodowany_tekst.decode("utf-8")
print(dekodowany_tekst) # Wyświetli "abc"

Normalizacja Unicode

Normalizacja Unicode to proces modyfikacji tekstu Unicode do postaci kanonicznej, zapewniając jednolite przedstawienie znaków. Istnieją dwa główne rodzaje normalizacji:

  • Normalization Form Canonical (NFC): Przekształca znaki w wersję prekomponowaną, złożoną z pojedynczych znaków Unicode.
  • Normalization Form Compose (NFC): Przekształca znaki pojedyncze w ich prekomponowane odpowiedniki.

W Pythonie normalizację można przeprowadzić za pomocą modułu unicodedata:


import unicodedata
tekst = "café"
tekst_znormalizowany_nfc = unicodedata.normalize("NFC", tekst)
tekst_znormalizowany_nfkc = unicodedata.normalize("NFKC", tekst)
print(tekst_znormalizowany_nfc)  # Wyświetli "café"
print(tekst_znormalizowany_nfkc)  # Wyświetli "cafe"

Sposoby reprezentacji łańcuchów Unicode

Python oferuje trzy zasadnicze metody reprezentowania łańcuchów Unicode:

  • Łańcuchy Unicode (u””): Zawierają znaki Unicode, wyrażone jako punkty kodowe.
  • Łańcuchy bajtów (b””): Zawierają zakodowany tekst Unicode.
  • Łańcuchy formatowane (f””): Umożliwiają wstawianie sformatowanych znaków Unicode do łańcuchów.

Porównywanie łańcuchów Unicode

Porównywanie łańcuchów Unicode może być problematyczne ze względu na różnice w reprezentacji. W Pythonie, przed porównaniem, należy przeprowadzić normalizację łańcuchów Unicode przy użyciu funkcji unicodedata.normalize(), aby uzyskać precyzyjne wyniki:


tekst1 = "café"
tekst2 = "café"
if unicodedata.normalize("NFC", tekst1) == unicodedata.normalize("NFC", tekst2):
    print("Łańcuchy są identyczne")
else:
    print("Łańcuchy różnią się")

Obsługa Unicode w systemach wejścia i wyjścia

Obsługa Unicode w systemach wejścia i wyjścia jest kluczowa dla aplikacji pracujących z tekstem międzynarodowym. W Pythonie, kodowanie konsoli i plików można skonfigurować za pomocą sys.stdout.encoding oraz funkcji open():


import sys
# Ustawienie kodowania konsoli na UTF-8
sys.stdout.encoding = "utf-8"
# Otwarcie pliku z kodowaniem UTF-8
with open("plik.txt", "w", encoding="utf-8") as f:
    f.write("Tekst w języku polskim")

Podsumowanie

Unicode jest fundamentalne dla pracy z tekstem o zasięgu międzynarodowym w Pythonie. Zapewnia ustandaryzowaną metodę reprezentowania znaków z rozmaitych języków i systemów pisma. Znajomość technik obsługi Unicode, omówionych w niniejszym artykule, umożliwi Ci tworzenie aplikacji, które sprawnie i efektywnie operują na tekstach z całego świata.

Najczęściej zadawane pytania

  1. Czym jest Unicode?
    Unicode to uniwersalny standard kodowania znaków, który umożliwia reprezentację symboli z różnych języków i systemów pisma.
  2. Jak zakodować tekst w Unicode w Pythonie?
    Tekst można zakodować w Unicode, konwertując znaki na punkty kodowe za pomocą funkcji ord().
  3. Jak zdekodować tekst Unicode w Pythonie?
    Aby zdekodować tekst Unicode, należy użyć funkcji decode() z podaniem odpowiedniego zestawu kodowania.
  4. Na czym polega normalizacja Unicode?
    Normalizacja Unicode to proces przekształcania tekstu Unicode do postaci kanonicznej w celu zapewnienia jednolitej reprezentacji znaków.
  5. Jak porównywać łańcuchy Unicode w Pythonie?
    Przed porównaniem łańcuchów Unicode, zaleca się ich normalizację przy użyciu funkcji unicodedata.normalize(), aby zapewnić precyzyjne wyniki.
  6. Jak skonfigurować obsługę Unicode w systemach wejścia i wyjścia w Pythonie?
    Można to zrobić za pomocą funkcji sys.stdout.encoding i open(), konfigurując odpowiednio kodowanie konsoli i plików.
  7. Jakie są trzy główne typy reprezentacji łańcuchowych Unicode w Pythonie?
    Są to: łańcuchy Unicode (u””), łańcuchy bajtów (b””) i łańcuchy formatowane (f””).
  8. Jak wstawić formatowane znaki Unicode do łańcuchów w Pythonie?
    Należy użyć łańcuchów formatowanych (f””) oraz specyfikatora formatowania \u w połączeniu z punktem kodowym Unicode.
  9. Czy Unicode obsługuje wszystkie języki świata?
    Tak, Unicode został zaprojektowany w taki sposób, aby obejmować wszystkie języki znane ludzkości.
  10. Czy istnieją jakieś narzędzia ułatwiające pracę z Unicode w Pythonie?
    Tak, istnieją biblioteki takie jak unicodedata, re i string, które dostarczają przydatne funkcje do pracy z Unicode.

newsblog.pl