W Unicode niektóre kombinacje znaków mają więcej niż jedną reprezentację.
Na przykład znak ä można przedstawić jako
- „ä”, czyli punkt kodowy U + 00E4 (dwa bajty
c3 a4
w kodowaniu UTF-8) lub jako - „ä”, tj. dwa punkty kodowe U + 0061 U + 0308 (trzy bajty
61 cc 88
w UTF-8).
Zgodnie ze standardem Unicode obie reprezentacje są równoważne, ale w różnych „formach normalizacji”, patrz UAX # 15: Formy normalizacji Unicode .
Przybornik unix ma wszystkie rodzaje narzędzi do przekształcania tekstu, sed , tr , iconv , Perl. Jak mogę szybko i łatwo przekonwertować NF w wierszu poleceń?
perl -MUnicode::Normalization -e 'print NFC(
... er, co teraz tu jest ...Odpowiedzi:
Możesz użyć
uconv
narzędzia z OIOM . Normalizację osiąga się poprzez transliterację (-x
).Na Debianie, Ubuntu i innych pochodnych
uconv
jest wlibicu-dev
pakiecie. W Fedorze, Red Hat i innych instrumentach pochodnych oraz w portach BSD jest wicu
pakiecie.źródło
any-nfd
? Wygląda na to, że prace nad tym narzędziem zostały porzucone, ostatnia aktualizacja miała miejsce w 2005 roku.any-nfd
przeglądając listę wyświetlaną przezuconv -L
.sudo apt install icu-devtools
do uruchomieniauconv -x any-nfc
, ale nie rozwiązuje najprostszego problemu , np.bugText.txt
Plik z „Iglésias, Bad-á, Good-á” przekonwertowany przezuconv -x any-nfc bugText.txt > goodText.txt
pozostanie ten sam tekst.Python ma
unicodedata
moduł w swojej standardowej bibliotece, który pozwala tłumaczyć reprezentacje Unicode poprzezunicodedata.normalize()
funkcję:Działa z Python 3.x:
Python nie jest dobrze przystosowany do linerów powłoki 1, ale można to zrobić, jeśli nie chcesz tworzyć zewnętrznego skryptu:
W Pythonie 2.x musisz dodać kodowanie line (
# -*- coding: utf-8 -*-
) i oznaczyć ciągi znaków jako Unicode znakiem u:źródło
Sprawdź to za pomocą narzędzia hexdump:
przekonwertuj za pomocą iconv i sprawdź ponownie za pomocą hexdump:
źródło
utf-8-mac
Linuksa i czy to normalne.Dla kompletności z
perl
:źródło
coreutils ma łatkę na poprawkę
unorm
. działa dobrze dla mnie na 4 bajtach wchars. śledź http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm Pozostały problem to 2-bajtowe systemy wchar (cygwin, windows, aix i solaris na 32-bitowe), które muszą przekształcić punkty kodowe z górnej zamienia się w pary zastępcze i na odwrót, a leżące u podstaw libunistring / gnulib nie jest jeszcze w stanie tego obsłużyć.perl ma
unichars
narzędzie, które wykonuje również różne formy normalizacji na cmdline. http://search.cpan.org/dist/Unicode-Tussle/script/unicharsźródło
Dostępne jest narzędzie Perla o nazwie Charlint
https://www.w3.org/International/charlint/
co robi, co chcesz. Musisz także pobrać plik z
ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
Po pierwszym uruchomieniu zobaczysz, że Charlint narzeka na niekompatybilne wpisy w tym pliku, więc będziesz musiał usunąć te linie z UnicodeData.txt.
źródło