Å (Ongustorome) und NFC @ Python

Es ist keine Nahfeldkommunikation, sondern eine Normalisierungsform der kanonischen Komposition.

Unicode-Normalisierung @ Wikipedia

In Unicode sind Å und Å unterschiedliche Zeichen.

Letzteres riecht zahlenmäßig nach Latin-1. In der Tat scheint es wahr zu sein.

Wenn sich NFC normalisiert, wird der Ongstrom zu A mit einem oberen Ring. Lassen Sie uns dies mit Python überprüfen.

>>> import unicodedata
>>> ord(unicodedata.normalize('NFC', '\N{ANGSTROM SIGN}'))
197
>>> unicodedata.name(unicodedata.normalize('NFC', '\N{ANGSTROM SIGN}'))
'LATIN CAPITAL LETTER A WITH RING ABOVE'

Unicodedata ist ein Standardbibliotheksmodul. Es ist ein Bonus, aber die NFD-Normalisierung, über die manchmal in macOS gesprochen wird, hat 2 Zeichen.

>>> len(unicodedata.normalize('NFD', '\N{ANGSTROM SIGN}'))
2
>>> [ord(ch) for ch in unicodedata.normalize('NFD', '\N{ANGSTROM SIGN}')]
[65, 778]
>>> [unicodedata.name(ch) for ch in unicodedata.normalize('NFD', '\N{ANGSTROM SIGN}')]
['LATIN CAPITAL LETTER A', 'COMBINING RING ABOVE']

Theoretisch kann diese Umwandlung ein Problem sein. Zum Beispiel kann Shift_JIS "Angstrom" ausdrücken, aber nicht "A mit oberem Ring". Wenn Sie Zeichen aus einer im Shift_JIS-Format gespeicherten Textdatei lesen und nach der NFC-Normalisierung erneut versuchen, diese im Shift_JIS-Format zu speichern, können Probleme auftreten.

>>> with open('from.txt', encoding='shift_jis') as fr:
...    with open('to.txt', 'w', encoding='shift_jis') as fw:
...        fw.write(unicodedata.normalize('NFC', fr.read()))
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
UnicodeEncodeError: 'shift_jis' codec can't encode character '\xc5' in position 0: illegal multibyte sequence

Wenn Sie das Lesen nicht notwendiger Dateien unterlassen

>>> '\N{ANGSTROM SIGN}'.encode('shift_jis')
b'\x81\xf0'
>>> unicodedata.normalize('NFC', '\N{ANGSTROM SIGN}').encode('shift_jis')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'shift_jis' codec can't encode character '\xc5' in position 0: illegal multibyte sequence

Offen gesagt:

>>> '\N{LATIN CAPITAL LETTER A WITH RING ABOVE}'.encode('shift_jis')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'shift_jis' codec can't encode character '\xc5' in position 0: illegal multibyte sequence

Ich habe dieses Beispiel in "Einführung in die Zeichencode-Technologie für Programmierer" gelernt, aber der Grund ist im selben Buch unbekannt ("Aus irgendeinem Grund ist es nicht", S. 353).

Also habe ich zufällig die folgende Beschreibung auf Wikipedia gesehen.

Das Einheitensymbol von Ongström ist dieses Zeichen, aber Unicode und JIS X 0213 definieren es als ein Zeichen, das sich vom ursprünglichen Zeichen unterscheidet. Das Unicode-Ongstrom-Symbol U + 212B ist jedoch ein kompatibles Zeichen, das nur zur Aufrechterhaltung der Abwärtskompatibilität mit älteren Standards verwendet werden kann und für die Verwendung nicht empfohlen wird. (Aus Wikipedia)

Ich verstehe, dass es einen Grund gibt, warum es nur aus Gründen der Abwärtskompatibilität verwendet werden kann.

Alle Unicode-Normalisierungen sind jedoch ziemlich besorgniserregend. Briefe sind schwierig.

Wenn Sie mit einem der beiden Browser im Browser suchen, werden beide als Bonus abgefangen. Ich glaube, ich suche nach der Normalisierung eines der vier Typen. Ich bin nicht sicher, ob der Suchvorgang Spezifikationen hat, die allen Browsern gemeinsam sind.

Wenn hier die einfache Beschwerde eines Endbenutzers erscheint, dass "dieses Zeichen verstümmelt ist", wird es zu "Hallo". Es ist nicht die Angelegenheit eines anderen, da ich mit einem System verbunden bin, in dem CP932, shift_jis und UTF-8 unter Windows verwechselt werden.

Recommended Posts

Å (Ongustorome) und NFC @ Python
[Python] Komprimieren und dekomprimieren
Python- und Numpy-Tipps
[Python] Pip und Wheel
Python Iterator und Generator
Python-Pakete und -Module
Vue-Cli- und Python-Integration
Ruby, Python und Map
Python-Eingabe und Ausgabe
Python und Ruby teilen sich
Python asyncio und ContextVar
Lesen und schreiben Sie NFC-Tags mit Python mit PaSoRi
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python: Klassen- und Instanzvariablen
3-3, Python-Zeichenfolge und Zeichencode
Python 2-Serie und 3-Serie (Anaconda Edition)
Python und Hardware-Verwenden von RS232C mit Python-
Python auf Ruby und wütend Ruby auf Python
Python-Einzug und String-Format
Python Real Number Division (/) und Integer Division (//)
Installieren Sie Python und Flask (Windows 10)
Informationen zu Python-Objekten und -Klassen
Informationen zu Python-Variablen und -Objekten
Apache mod_auth_tkt und Python AuthTkt
Lernen Sie Python-Pakete und -Module kennen
# 2 [python3] Trennung und Kommentar aus
Flache Python-Kopie und tiefe Kopie
Python und Ruby Slice Memo
Python-Installation und grundlegende Grammatik
Ich habe Java und Python verglichen!
Flache Python-Kopie und tiefe Kopie
Über Python, len () und randint ()
Informationen zu Python-Datums- und Zeitzone
Installieren Sie Python 3.7 und Django 3.0 (CentOS)
Python-Umgebungskonstruktion und TensorFlow
Python-Klassen- und Instanzvariablen
Ruby- und Python-Syntax ~ branch ~
[Python] Python und Sicherheit - is Was ist Python?
Stapel und Warteschlange in Python
Python-Metaklasse und SQLalchemie deklarativ
Implementierung von Fibonacci und Primzahlen (Python)
Python-Grundlagen: Bedingungen und Iterationen
Python-Bitoperator und logische Summe
Python-Debug- und Testmodul
Python-Liste und Tapples und Kommas
Python-Variablen und Objekt-IDs
Python-Listeneinschlussnotation und Generator
Über Python und reguläre Ausdrücke
Python mit Pyenv und Venv
Unittest und CI in Python
Maxout Beschreibung und Implementierung (Python)
[Python] Quotient und Überschuss erhalten
Python 3 Sortier- und Vergleichsfunktionen
[Python] Suche nach Tiefenpriorität und Suche nach Breitenpriorität
Identität und Äquivalenz: ist und == in Python
Quellinstallation und Installation von Python
Python oder und und Operatorfalle
Fordern Sie Python3 und Selenium Webdriver heraus