ইউনিক্স কমান্ড-লাইনের ইউনিকোড নরমালাইজেশন ফর্মগুলির মধ্যে রূপান্তর করুন


22

ইউনিকোডে কিছু চরিত্রের সংমিশ্রণের একাধিক উপস্থাপনা থাকে।

উদাহরণ হিসেবে বলা যায়, চরিত্র একটি হিসাবে প্রতিনিধিত্ব করা যেতে পারে

  • "ä", এটি কোডপয়েন্ট ইউ + 00E4 ( c3 a4ইউটিএফ -8 এনকোডিংয়ে দুটি বাইট ), বা হিসাবে
  • "ä", এটি হ'ল দুটি কোডপয়েন্টগুলি ইউ + 0061 ইউ + 0308 ( 61 cc 88ইউটিএফ -8 এ তিন বাইট )।

ইউনিকোড স্ট্যান্ডার্ড অনুযায়ী, দুটি উপস্থাপনা সমান হলেও বিভিন্ন "নরমালাইজেশন ফর্ম" এ, ইউএএক্স # 15 দেখুন: ইউনিকোড নরমালাইজেশন ফর্মগুলি

ইউনিক্স টুলবক্সে সব ধরণের পাঠ্য রূপান্তরের সরঞ্জাম রয়েছে, সেড , ট্র , আইকনভি , পার্ল মাথায় আসে to কমান্ড-লাইনে কীভাবে আমি দ্রুত এবং সহজ এনএফ রূপান্তর করতে পারি?


2
দেখে মনে হচ্ছে Perl যা জিনিস এই ধরনের কি করা উচিত জন্য একটি "ইউনিকোড :: স্বাভাবিক" মডিউল থাকে: search.cpan.org/~sadahiro/Unicode-Normalize-1.16/Normalize.pm
স্বর্ণকেশ

@goldilocks যদি এটি একটি CLI ছিল ... আমি বলতে চাচ্ছি, আমি কি perl -MUnicode::Normalization -e 'print NFC(... Er কি এখানে এখন আসে ...
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

ডেবিয়ান, উবুন্টু এবং অন্যান্য ডেরাইভেটিভস তারিখে uconvহয় libicu-devপ্যাকেজ। ফেডোরা, রেড হ্যাট এবং অন্যান্য ডেরিভেটিভস এবং বিএসডি পোর্টগুলিতে এটি icuপ্যাকেজে রয়েছে।


ধন্যবাদ, ধন্যবাদ। যদিও আপনি এটির পাশাপাশি একটি 30 এম দেব লাইব্রেরি ইনস্টল করতে হবে। সবচেয়ে খারাপ বিষয়, আমি নিজেই ইউকনভের জন্য সঠিক ডকুমেন্টেশন খুঁজে পাইনি: আপনি কোথায় পেলেন any-nfd? দেখে মনে হচ্ছে এই সরঞ্জামটির বিকাশ পরিত্যাগ করা হয়েছে, সর্বশেষ আপডেটটি 2005 সালে হয়েছিল
glts

2
@glts এর any-nfdদ্বারা প্রদর্শিত তালিকার মাধ্যমে ব্রাউজ করে আমি পেয়েছি uconv -L
গিলস 23'8

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", "ääääää"))'
ääääää

পাইথন ২.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  

আইকনভি দিয়ে রূপান্তর করুন এবং হেক্সডাম্প দিয়ে আবার চেক করুন:

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

00000000  c3 a4                                             |..|
00000002

printf '\xc3\xa4'
ä

2
এটি কেবল ম্যাকোজে কাজ করে। লিনাক্সে, ফ্রিবিএসডি ইত্যাদিতে কোনও 'ইউটিএফ-৮-ম্যাক' নেই। এছাড়াও, এই এনকোডিংটি ব্যবহার করে পচনটি স্পেসিফিকেশন অনুসরণ করে না (যদিও এটি ম্যাকোস ফাইল সিস্টেম স্বাভাবিককরণের অ্যালগরিদম অনুসরণ করে)। আরো তথ্য: search.cpan.org/~tomita/Encode-UTF8Mac-0.04/lib/Encode/...
antonone

প্রশ্নটিতে কোনও ওএস নির্দিষ্ট না হলেও @ অ্যান্টোনোন ন্যায্য হতে হবে।
রোয়াইমা

1
@ রাইমা হ্যাঁ, তাই আমি ধরে নিয়েছি যে উত্তরটি ইউনিক্স / লিনাক্স ভিত্তিক সমস্ত সিস্টেমে কাজ করা উচিত। উপরের উত্তরটি কেবল ম্যাকোজে কাজ করে। যদি কেউ ম্যাকোস-নির্দিষ্ট উত্তর খুঁজছেন, তবে এটি কিছু অংশে কাজ করবে। আমি কেবল এটি উল্লেখ করতে চেয়েছিলাম, কারণ অন্য দিন আমি 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। 4 বাইট ওয়ারচার্সের জন্য আমার জন্য সূক্ষ্ম কাজ করে। http://crashcourse.housegordon.org/coreutils-multbyte-support.html#unorm অনুসরণ করুন বাকি সমস্যাটি 2-বাইট উইচার সিস্টেমগুলি রয়েছে (সাইগউইন, উইন্ডোজ, প্লাস আইক্স এবং সোলারিস 32 বিট), যা উপরের থেকে কোডপয়েন্টগুলিকে রূপান্তর করতে হবে সরোগেট জোড় এবং বিপরীতে প্লেনগুলি এবং অন্তর্নিহিত লাইবুনিস্ট্রিং / গনুলিব এখনও এটি পরিচালনা করতে পারে না।

পারেলের একটি unicharsসরঞ্জাম রয়েছে যা সেমিডলাইনে বিভিন্ন সাধারণকরণের ফর্মও করে। http://search.cpan.org/dist/Unicode-Tussle/script/unichars


2

চার্লিন্ট নামে একটি পার্ল ইউটিলিটি রয়েছে যা থেকে পাওয়া যায়

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

যা আপনি যা চান তা করে আপনাকে এ থেকে একটি ফাইলও ডাউনলোড করতে হবে

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

প্রথম রান করার পরে আপনি চার্লিন্ট সেই ফাইলটিতে বেমানান এন্ট্রি সম্পর্কে অভিযোগ করতে দেখবেন তাই আপনাকে ইউনিকোডডেটা.টেক্সট থেকে সেই লাইনগুলি মুছতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.