কিছু ইউনিকোড অক্ষর সহ আমার `ইউনিক` বা` সাজানো -u` লাইনটি কোথায় গেছে


10

নিম্নলিখিত কোড স্নিপেটে কি চলছে? আমি আমার প্রত্যাশিত আউটপুট পাচ্ছি না।

আমি মনে করি এটি একটি বাগ ছিল, তবে এটি 2 টি পৃথক প্রোগ্রামের জন্য ঘটে (ইউনিট এবং সাজান), সুতরাং আমি সন্দেহ করি এটি এর সাথে করার কিছু ... ভাল, আমি জানি না কি .. সুতরাং প্রশ্ন the

প্রথম 3 টি (4 এর) উদাহরণগুলি কাজ করে তবে চতুর্থটি ব্যর্থ হয়!

আমি যে কোনও এবং সমস্ত চরিত্রের জন্য একই আচরণ আশা করব।
অর্থাত। 2 লাইন (ইনপুট 3 লাইন থেকে) মুদ্রণ করতে ... কিন্তু চতুর্থ ক্ষেত্রে, আমি কেবল 1 লাইন (উভয় sort -uএবং উভয়ের জন্য uniq) পাই ; দুটি অভিন্ন লাইন কেবল বিলুপ্ত!

আমি সংক্ষিপ্ততার জন্য আউটপুট '\ n' কে স্থানটিতে রূপান্তর করেছি।

আমি ব্যবহার করছি uniq এবং সাজানোর থেকে (গনুহ coreutils) 7.4 ... উবুন্টু 10.04.3 LTS ডেস্কটপে চলছে।

এই পান্ডুলিপি:

{
  locale -k LC_COLLATE
  echo
  for c1 in x 〼 ;do 
    for c2 in z 〇 ;do 
      echo -n "asis   : "; echo -e "$c1\n$c2\n$c2"          |tr '\n' ' ';echo
      echo -n "uniq   : "; echo -e "$c1\n$c2\n$c2" |uniq    |tr '\n' ' ';echo
      echo -n "sort -u: "; echo -e "$c1\n$c2\n$c2" |sort -u |tr '\n' ' ';echo
      echo
    done
    echo
  done
}

আউটপুট:

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2081
collate-codeset="UTF-8"

asis   : x z z 
uniq   : x z 
sort -u: x z 

asis   : x 〇 〇 
uniq   : x 〇 
sort -u: 〇 x 


asis   : 〼 z z 
uniq   : 〼 z 
sort -u: 〼 z 

asis   : 〼 〇 〇 
uniq   : 〼 
sort -u: 〼 

# In the last example (of 4) where did the '〇' go? .. U+3007 IDEOGRAPHIC NUMBER ZERO
#

দয়া করে মনে রাখবেন .. এটি বেশ পরিষ্কার করার জন্য। sortএকা ( -u বিকল্প ব্যতীত) ... চরিত্রগুলিকে ঝাঁকুনি দেয় না ... কী ভিতরে যায়, বেরিয়ে আসে ... তবে, গিলস দ্বারা প্রত্যাশা করা যেতে পারে "বহিরাগত" ইউনিকোড অক্ষরের একই নীতিগত মান রয়েছে , এগুলি অক্ষরগুলি সাজানো হয় না, এগুলি ছাড়াও তারা সাজানো আউটপুটটির "শীর্ষে" একটি নিরবচ্ছিন্ন ফিফো গোষ্ঠী হিসাবে আউটপুট হয় ... সুতরাং এখানে দুটি সত্যিই সমস্যা রয়েছে: ১. অক্ষরগুলি সাজানো হয় না "নির্লজ্জভাবে" "প্রত্যাশিত, এবং 2. উভয়ের" অনন্য "বৈশিষ্ট্য sortএবং uniqডেটা হারাবে (কিছু ক্ষেত্রে)।
পিটার.ও

আপডেট: গিলস দ্বারা উল্লিখিত হিসাবে (যখন লোকেল-নির্দিষ্ট বাছাই করা প্রয়োজনীয় নয় এবং চরিত্রের sort -uuniqLC_COLLATE=C; echo -e "〼\n〇\n〇" |sort -u|uniq
ক্রমটি যথাযথ নয়

উত্তর:


11

সংক্ষিপ্ত সংস্করণ: জোটটি কমান্ড লাইন ইউটিলিটিগুলিতে সত্যিই কাজ করে না।

দীর্ঘতর সংস্করণ: দুটি স্ট্রিংয়ের তুলনা করার অন্তর্নিহিত ফাংশনটি strcoll। বিবরণটি খুব সহায়ক নয়, তবে ক্রিয়াকলাপের ধারণামূলক পদ্ধতিটি হ'ল উভয় স্ট্রিংকে একটি প্রচলিত আকারে রূপান্তর করা এবং তারপরে দুটি ক্যানোনিকাল ফর্মের তুলনা করা। ফাংশনটি strxfrmএই আধ্যাত্মিক ফর্মটি তৈরি করে।

আসুন কয়েকটি স্ট্রিংয়ের আধ্যাত্মিক রূপগুলি পর্যালোচনা করুন (GNU libc সহ, ডিবিয়ান স্কুজের অধীনে):

$ export LC_ALL=en_US.UTF-8
$ perl -C255 -MPOSIX -le 'print "$_ ", unpack("h*", strxfrm($_)) foreach @ARGV' b a A à 〼 〇
b d010801020
a c010801020
A c010801090
à 101010102c6b
〼 101010102c6b102c6b102c6b
〇 101010102c6b102c6b102c6b

যেমন আপনি দেখতে পাচ্ছেন, 〼 এবং এর একই প্রথাগত ফর্ম রয়েছে। আমি মনে করি কারণ এই অক্ষরগুলির en_US.UTF-8লোকেলের জোট টেবিলগুলিতে উল্লেখ করা হয়নি । তারা অবশ্য জাপানের লোকালে উপস্থিত রয়েছে।

$ export LC_ALL=ja_JP.UTF-8
$ perl -C255 -MPOSIX -le 'print "$_ ", unpack("h*", strxfrm($_)) foreach @ARGV' 〼 〇 
〼 303030
〇 3c9b

স্থানীয় ডেটা (ডেবিয়ান স্কুজে) এর উত্স কোডটি /usr/share/i18n/locales/en_USরয়েছে, যার মধ্যে রয়েছে /usr/share/i18n/locales/iso14651_t1_common। এই ফাইলটির জন্য U3007বা এন্ট্রি নেই বা U303Cএগুলি আমার সন্ধান করতে পারে এমন কোনও ব্যাপ্তির অন্তর্ভুক্ত নয়।

আমি কোলেশন অর্ডার তৈরির নিয়মগুলির সাথে পরিচিত নই , তবে যা আমি বুঝতে পারি তার থেকে প্রাসঙ্গিক ফ্রেসিং

বর্ণনামূলক চিহ্নটি ব্যাখ্যা করা হবে সমস্ত কোডেড অক্ষর সেট মান সহ স্পষ্টভাবে বা উপবৃত্ত চিহ্নের সাহায্যে নির্দিষ্ট নয় including (…) যদি কোনও নির্ধারিত চিহ্ন নির্দিষ্ট না করা থাকে এবং বর্তমান কোডেড অক্ষর সেটটিতে এই বিভাগে নির্দিষ্ট না হওয়া অক্ষর রয়েছে তবে ইউটিলিটি একটি সতর্কতা বার্তা জারি করবে এবং অক্ষর সমাহার ক্রমের শেষে এই জাতীয় অক্ষর স্থাপন করবে।

দেখে মনে হচ্ছে গ্লিবসি পরিবর্তে নির্দিষ্ট করা অক্ষরগুলিকে উপেক্ষা করছে। আমি জানি না যে পিসিক্স স্পেক সম্পর্কে আমার বোঝার ত্রুটি আছে কি না, যদি আমি গ্লিবিকের লোকাল সংজ্ঞায় কিছু মিস করি, বা যদি গ্লিবসি লোকেলের সংকলকটিতে কোনও বাগ থাকে।


@Gilles: তথ্যপূর্ণ এবং বিস্তারিত ব্যাখ্যা করার জন্য ধন্যবাদ .. এটা এখন কিছু জ্ঞান করে তোলে, কিন্তু আমি হতাশ করছি ছেড়ে কীভাবে "নিরাপদে" ব্যবহার সাজানোর .. আমি না একটি বিশেষ "লোকেল সংবেদনশীল" পরে আছি সাজানোর কোনো রুক্ষ তাই বাছাই করতে হবে ... এই জন্য একটি দ্রুত workaround আছে? ... এবং আমি ধীরে ধীরে এটির হ্যাংটি পেয়ে যাব, তবে এটি 'রাতারাতি' ঘটবে না ... উদাহরণস্বরূপ .. আমার / ইউএসআর / শেয়ার / আই 18 এন / চারম্যাপস / ইউটিএফ -8 এ প্রশ্নের দুটি অক্ষরের উল্লেখ রয়েছে , তবে এই ইউটিএফ -8 সংজ্ঞায় থাকা (?) মনে হচ্ছে বলে মনে হচ্ছে না ... ওহ ভাল, জীবন এর ছোট রহস্য ছাড়া কেমন হবে? :) ...
পিটার.ও

1
@ ফ্রেড charmaps/UTF-8কোলেশন সম্পর্কে কিছু বলেন না, এটি locales/en_USগুরুত্বপূর্ণ। প্রথম নিয়মটি LC_COLLATEহল: ব্যবহার করবেন না LC_COLLATE। সি (= পোসিক্স) লোকালে, কোলেশনটি যুক্তিসঙ্গত (সংখ্যার চরিত্রের মানগুলির উপর ভিত্তি করে)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

2
বাছাই এবং অনন্য দৃষ্টিভঙ্গি কাজ জরিমানা যখন পূর্বে দ্বারা LC_COLLATE=C... ধন্যবাদ ...
Peter.O

1
এটা যে না কোলেশন ইউটিলিটি কাজ করে না কিন্তু যে জন্য glibc লোকেল দুর্বল ডিজাইন করা হয়। সেই আচরণটি (বর্তমানে, তবে দেখুন পসিএক্স দ্বারা অনুমোদিত austingroupbugs.net/view.php?id=1070 ) তবে দুর্ভাগ্যজনক এবং অনাকাঙ্ক্ষিত।
স্টাফেন চেজেলাস

6

sortইউনিকোড স্ট্রিংগুলিকে "নিরাপদে" রাখতে , একবার দেখুন msort:

[...] এমসোর্টটি মূল ক্ষেত্রগুলি নির্বাচন করার ক্ষেত্রে আরও বেশি স্বাচ্ছন্দ্য দেয়, আরও তুলনা করার ধরণগুলি, বিভিন্ন কীগুলিতে বিভিন্ন লোকেল থেকে কোলেশন বিধি ব্যবহার করার ক্ষমতা, অ-পশ্চিমা সংখ্যা সিস্টেমে সংখ্যাগুলি পরিচালনা করার ক্ষমতা এবং অন্যান্য বিভিন্ন বিকল্পের অভাব রয়েছে GNU বাছাই এবং BSD সাজানোর মধ্যে। যেখানে এমসোর্ট ইউনিকোড বোঝে, জিএনইউ সাজ্ট এবং বিএসডি সাজ্ট করবেন না। [...]

http://www.billposer.org/Software/msort.html


@til: আমাকে সচেতন তৈরীর জন্য ধন্যবাদ msort। Alচ্ছিক জিইউআই অফারটিতে কী রয়েছে তা অনুভব করতে ভূমিকাটি কিছুটা সহজ করে তোলে। উত্পন্ন কমান্ডটি অনুলিপি করতে সক্ষম হওয়া খুব সহজ ... এবং হ্যাঁ, এটি ইউনিকোড অক্ষরগুলি বাছাই করে তবে (আপনি কেবল "বুটগুলিকে পছন্দ করেন না") ... তবে এর কোনও অনন্য বিকল্প নেই: (... আপনি যে লিঙ্কটিতে পোস্ট করেছেন তার উপরে উল্লেখ করা হয়েছে: Capabilities of GNU sort and BSD sort lacking in msort are the ability to merge files without sorting them (the --merge option) and the ability to emit only the first of an equal run (the --unique option)... সাজানোর কাজ যদিও :)
পিটার.ও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.