Dalam Unicode, beberapa kombinasi karakter memiliki lebih dari satu representasi.
Misalnya, karakter ä dapat direpresentasikan sebagai
- "ä", itu adalah codepoint U + 00E4 (dua byte
c3 a4
dalam pengkodean UTF-8), atau sebagai - "ä", itu adalah dua codepoints U + 0061 U + 0308 (tiga byte
61 cc 88
dalam UTF-8).
Menurut standar Unicode, dua representasi itu setara tetapi dalam "bentuk normalisasi" yang berbeda, lihat UAX # 15: Bentuk Normalisasi Unicode .
Kotak alat unix memiliki semua jenis alat transformasi teks, sed , tr , iconv , Perl datang ke pikiran. Bagaimana saya bisa melakukan konversi NF cepat dan mudah pada command-line?
perl -MUnicode::Normalization -e 'print NFC(
... eh apa yang datang ke sini sekarang ...Jawaban:
Anda dapat menggunakan
uconv
utilitas dari ICU . Normalisasi dicapai melalui transliterasi (-x
).Pada Debian, Ubuntu dan turunan lainnya,
uconv
ada dalamlibicu-dev
paket. Pada Fedora, Red Hat dan turunan lainnya, dan di port BSD, ada dalamicu
paket.sumber
any-nfd
? Sepertinya pengembangan alat ini telah ditinggalkan, pembaruan terakhir adalah pada tahun 2005.any-nfd
dengan menelusuri daftar yang ditampilkan olehuconv -L
.sudo apt install icu-devtools
untuk menjalankanuconv -x any-nfc
, tetapi tidak memecahkan masalah yang paling sederhana , misalnyabugText.txt
file dengan "Iglésias, Bad-á, Good-á" dikonversi olehuconv -x any-nfc bugText.txt > goodText.txt
tetap teks yang sama.Python memiliki
unicodedata
modul di pustaka standarnya, yang memungkinkan untuk menerjemahkan representasi Unicode melaluiunicodedata.normalize()
fungsi:Berjalan dengan Python 3.x:
Python tidak cocok untuk shell one liners, tetapi bisa dilakukan jika Anda tidak ingin membuat skrip eksternal:
Untuk Python 2.x Anda harus menambahkan line encoding (
# -*- coding: utf-8 -*-
) dan menandai string sebagai Unicode dengan karakter u:sumber
Periksa dengan hexdump alat:
konversi dengan iconv dan periksa lagi dengan hexdump:
sumber
utf-8-mac
Linux dan apakah ini normal.Untuk kelengkapan, dengan
perl
:sumber
coreutils memiliki patch untuk mendapatkan yang tepat
unorm
. bekerja dengan baik untuk saya pada 4byte wchars. mengikuti http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm Masalah yang tersisa ada sistem wchar 2-byte (cygwin, windows, plus aix dan solaris pada 32bit), yang perlu mengubah codepoint dari atas pesawat menjadi pasangan pengganti dan sebaliknya, dan libunistring / gnulib yang mendasarinya belum bisa mengatasinya.perl memiliki
unichars
alat, yang juga melakukan berbagai bentuk normalisasi pada cmdline. http://search.cpan.org/dist/Unicode-Tussle/script/unicharssumber
Ada utilitas perl bernama Charlint tersedia dari
https://www.w3.org/International/charlint/
yang melakukan apa yang Anda inginkan. Anda juga harus mengunduh file dari
ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
Setelah jalankan pertama Anda akan melihat Charlint mengeluh tentang entri yang tidak kompatibel dalam file itu sehingga Anda harus menghapus baris-baris itu dari UnicodeData.txt.
sumber