यूनिक्स कमांड लाइन पर यूनिकोड सामान्यीकरण प्रपत्रों के बीच कनवर्ट करें


22

यूनिकोड में, कुछ चरित्र संयोजनों में एक से अधिक प्रतिनिधित्व होते हैं।

उदाहरण के लिए, चरित्र ä के रूप में प्रतिनिधित्व किया जा सकता है

  • "ä", वह कोडपॉइंट U + 00E4 ( c3 a4UTF-8 एन्कोडिंग में दो बाइट्स ), या के रूप में है
  • "ä", वह दो कोडपाइंट U + 0061 U + 0308 ( 61 cc 88UTF-8 में तीन बाइट्स ) है।

यूनिकोड मानक के अनुसार, दो अभ्यावेदन समतुल्य हैं लेकिन अलग-अलग "सामान्यीकरण रूपों" में, UAX # 15: यूनिकोड सामान्यीकरण प्रपत्र देखें

यूनिक्स टूलबॉक्स पाठ परिवर्तन उपकरण, के सभी प्रकार है sed , टीआर , iconv , पर्ल दिमाग में आते हैं। मैं कमांड-लाइन पर त्वरित और आसान एनएफ रूपांतरण कैसे कर सकता हूं?


2
ऐसा लगता है कि पर्ल के लिए एक "यूनिकोड :: सामान्यीकरण" मॉड्यूल है जो इस तरह का काम करना चाहिए: search.cpan.org/~sadahiro/Unicode-Normalize-1.16/Normalize.pm
Goldilp

@goldilocks अगर यह एक सीएलआई था ... मेरा मतलब है, मैं perl -MUnicode::Normalization -e 'print NFC(... एर अब यहाँ क्या आता है ...
mirabilos

जवाबों:


20

आप आईसीयूuconv से उपयोगिता का उपयोग कर सकते हैं । सामान्यीकरण लिप्यंतरण ( ) के माध्यम से प्राप्त किया जाता है ।-x

$ uconv -x any-nfd <<<ä | hd
00000000  61 cc 88 0a                                       |a...|
00000004
$ uconv -x any-nfc <<<ä | hd
00000000  c3 a4 0a                                          |...|
00000003

डेबियन, Ubuntu और अन्य डेरिवेटिव पर, uconvमें है libicu-devपैकेज। फेडोरा, रेड हैट और अन्य डेरिवेटिव्स पर, और बीएसडी बंदरगाहों में, यह icuपैकेज में है।


यह काम करता है, धन्यवाद। आपको हालांकि इसके साथ 30M देव पुस्तकालय स्थापित करना होगा। क्या बुरा है, मैं खुद uconv के लिए उचित दस्तावेज खोजने में सक्षम नहीं है: आपने कहां पाया any-nfd? ऐसा लगता है कि इस उपकरण के विकास को छोड़ दिया गया है, 2005 में अंतिम अद्यतन किया गया था।
glts

2
@glts any-nfdद्वारा प्रदर्शित सूची के माध्यम से ब्राउज़ करके मैंने पाया uconv -L
गिलेस एसओ- बुराई को रोकना '

उबंटू sudo apt install icu-devtoolsको चलाने के लिए uconv -x any-nfc, लेकिन सरलतम समस्या का समाधान न करें , उदाहरण bugText.txt के लिए "इग्लियस, बैड-ए, गुड-एए" के साथ एक फ़ाइल को एक uconv -x any-nfc bugText.txt > goodText.txtही पाठ द्वारा परिवर्तित किया गया।
पीटर क्रूस

7

पायथन unicodedataमें अपने मानक पुस्तकालय में मॉड्यूल है, जो unicodedata.normalize()फ़ंक्शन के माध्यम से यूनिकोड अभ्यावेदन का अनुवाद करने की अनुमति देता है :

import unicodedata

s1 = 'Spicy Jalape\u00f1o'
s2 = 'Spicy Jalapen\u0303o'

t1 = unicodedata.normalize('NFC', s1)
t2 = unicodedata.normalize('NFC', s2)
print(t1 == t2) 
print(ascii(t1)) 

t3 = unicodedata.normalize('NFD', s1)
t4 = unicodedata.normalize('NFD', s2)
print(t3 == t4)
print(ascii(t3))

अजगर 3.x के साथ चल रहा है:

$ python3 test.py
True
'Spicy Jalape\xf1o'
True
'Spicy Jalapen\u0303o'

पायथन शेल एक लाइनर के लिए अच्छी तरह से अनुकूल नहीं है, लेकिन यह तब किया जा सकता है जब आप बाहरी स्क्रिप्ट नहीं बनाना चाहते हैं:

$ python3 -c $'import unicodedata\nprint(unicodedata.normalize("NFC", "ääääää"))'
ääääää

पायथन 2.x के लिए आपको एन्कोडिंग लाइन ( # -*- coding: utf-8 -*-) को जोड़ना होगा और यू किरदार के साथ यूनिकोड के रूप में चिह्नित करना होगा:

$ python -c $'# -*- coding: utf-8 -*-\nimport unicodedata\nprint(unicodedata.normalize("NFC", u"ääääää"))'
ääääää

3

टूल हेक्सडंप के साथ इसे जांचें:

echo  -e "ä\c" |hexdump -C 

00000000  61 cc 88                                          |a..|
00000003  

iconv के साथ परिवर्तित करें और hexdump के साथ फिर से जांचें:

echo -e "ä\c" | iconv -f UTF-8-MAC -t UTF-8 |hexdump -C

00000000  c3 a4                                             |..|
00000002

printf '\xc3\xa4'
ä

2
यह केवल macOS पर काम करता है। फ्रीबीएसडी आदि पर लिनक्स पर कोई 'यूटीएफ-8-मैक' नहीं है। इसके अलावा, इस एन्कोडिंग का उपयोग करके अपघटन विनिर्देश का पालन नहीं करता है (यह हालांकि मैकओएस फाइलसिस्टम सामान्यीकरण एल्गोरिथ्म का पालन करता है)। अधिक जानकारी: search.cpan.org/~tomita/Encode-UTF8Mac-0.04/lib/Encode/…
antonone

@antonone निष्पक्ष होने के लिए हालांकि प्रश्न में कोई ओएस निर्दिष्ट नहीं था।
रोज़ा

1
@roaima हाँ, इसीलिए मैंने यह मान लिया है कि उत्तर उन सभी प्रणालियों पर काम करना चाहिए जो यूनिक्स / लिनक्स पर आधारित हैं। उपरोक्त उत्तर केवल macOS पर काम करता है। यदि किसी को macOS- विशिष्ट उत्तर की तलाश है, तो यह भाग में काम करेगा। मैं बस यही कहना चाहता था, क्योंकि दूसरे दिन मैंने यह सोचकर कुछ समय खो दिया कि मेरे पास utf-8-macलिनक्स पर क्यों नहीं है और अगर यह सामान्य है।
एंटोनोन

3

पूर्णता के लिए, इसके साथ perl:

$ perl -CSA -MUnicode::Normalize=NFD -e 'print NFD($_) for @ARGV' $'\ue1' | uconv -x name
\N{LATIN SMALL LETTER A}\N{COMBINING ACUTE ACCENT}
$ perl -CSA -MUnicode::Normalize=NFC -e 'print NFC($_) for @ARGV' $'a\u301' | uconv -x name
\N{LATIN SMALL LETTER A WITH ACUTE}

2

कोर्यूटिल्स के पास एक उचित प्राप्त करने के लिए एक पैच है unorm। 4byte wchars पर मेरे लिए ठीक काम करता है। http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm का अनुसरण करें शेष समस्या 2-बाइट वाचर सिस्टम (साइबरविन, विंडोज, प्लस ऐक्स और सोलारिस 32 बिट पर हैं, जिन्हें कोडपाइंट को ऊपरी से बदलने की आवश्यकता है सरोगेट जोड़े और इसके विपरीत में विमान, और अंतर्निहित libunistring / gnulib अभी तक नहीं संभाल सकता है।

पर्ल में unicharsटूल है, जो cmdline पर विभिन्न सामान्यीकरण फॉर्म भी करता है। http://search.cpan.org/dist/Unicode-Tussle/script/unichars


2

वहाँ एक पर्ल उपयोगिता है जिसे चार्लिंट कहा जाता है

https://www.w3.org/International/charlint/

जो आपको चाहिए आपको एक फ़ाइल भी डाउनलोड करनी होगी

ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt

पहले भाग के बाद आप उस फ़ाइल में असंगत प्रविष्टियों के बारे में शिकायत करते हुए चार्लिंट देखेंगे, ताकि आपको उन लाइनों को यूनिकोडडाटा.नेट से हटाना पड़े।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.