আধুনিক পার্ল কেন ইউটিএফ -8 এ ডিফল্টরূপে এড়ানো যায়?


557

আমি ভাবছি কেন পার্ল ব্যবহার করে নির্মিত বেশিরভাগ আধুনিক সমাধানগুলি ডিফল্টরূপে ইউটিএফ -8 সক্ষম করে না ।

আমি বুঝতে পারি কোর পার্ল স্ক্রিপ্টগুলির জন্য অনেকগুলি উত্তরাধিকারের সমস্যা রয়েছে, যেখানে এটি জিনিসগুলি ভেঙে দিতে পারে। তবে, আমার দৃষ্টিকোণ থেকে, 21 শতাব্দীতে, বড় বড় নতুন প্রকল্পগুলি (বা একটি বড় দৃষ্টিকোণযুক্ত প্রকল্পগুলি) তাদের সফ্টওয়্যারটি ইউটিএফ -8 প্রারম্ভ থেকে তৈরি করা উচিত। তবুও আমি এটি ঘটতে দেখছি না। উদাহরণস্বরূপ, মুস কঠোর এবং সতর্কবার্তা সক্ষম করে তবে ইউনিকোডে নয় । আধুনিক :: পার্ল বয়লারপ্লেটও হ্রাস করে তবে কোনও ইউটিএফ -8 হ্যান্ডলিং করে না।

কেন? ২০১১ সালে আধুনিক পার্ল প্রকল্পগুলিতে ইউটিএফ -৮ এড়ানোর কিছু কারণ রয়েছে?


@ ক্রিশ্চকে মন্তব্য করা খুব দীর্ঘ হয়েছে, তাই আমি এটি এখানে যুক্ত করছি।

দেখে মনে হচ্ছে আমি নিজেকে পরিষ্কার করে নিই না। আমাকে কিছু জিনিস যুক্ত করার চেষ্টা করুন।

tchrist এবং আমি পরিস্থিতি বেশ একইভাবে দেখতে পাই, তবে আমাদের সিদ্ধান্তগুলি সম্পূর্ণ বিপরীত প্রান্তে। আমি সম্মত হই, ইউনিকোডের পরিস্থিতি জটিল, তবে আমাদের (পার্ল ব্যবহারকারী এবং কোডার) কিছু স্তর (বা প্রাগমা) প্রয়োজন যা ইউটিএফ -8 হ্যান্ডলিংকে আজকালকারের মতো সহজ করে তোলে।

tchrist কভার অনেক দিক নির্দেশিত, আমি কয়েক দিন বা সপ্তাহের জন্য তাদের পড়তে এবং চিন্তা করব। তবুও, এটি আমার বক্তব্য নয়। tchrist প্রমাণ করার চেষ্টা করে যে "ইউটিএফ -8 সক্ষম করার একক উপায় নেই"। এ নিয়ে তর্ক করার মতো এত জ্ঞান আমার নেই। সুতরাং, আমি লাইভ উদাহরণ আঁকড়ে থাকি।

আমি রাকুডোর সাথে চারপাশে খেলেছি এবং ইউটিএফ -8 ঠিক আমার প্রয়োজন মতো সেখানে ছিল । আমার কোনও সমস্যা হয়নি, এটি কেবল কাজ করেছে। আরও গভীরতর কোথাও কিছু সীমাবদ্ধতা রয়েছে তবে শুরুতে, আমি পরীক্ষিত সমস্তই আমার প্রত্যাশা অনুযায়ী কাজ করেছিল।

আধুনিক পার্ল 5 এও কি লক্ষ্য হওয়া উচিত নয়? আমি এটি আরও চাপ দিয়ে থাকি: কোর পার্লের জন্য আমি ইউটিএফ -8 কে ডিফল্ট চরিত্র হিসাবে সেট করতে পরামর্শ দিচ্ছি না, আমি নতুন প্রকল্পগুলি বিকাশকারীদের জন্য এটি একটি স্ন্যাপ দিয়ে এটিকে ট্রিগার করার সম্ভাবনাটি প্রস্তাব করছি ।

আরেকটি উদাহরণ, তবে আরও নেতিবাচক স্বরে। ফ্রেমওয়ার্কগুলির উন্নয়ন সহজ করা উচিত। কয়েক বছর আগে, আমি ওয়েব ফ্রেমওয়ার্ক চেষ্টা করেছিলাম, তবে কেবল সেগুলি ফেলে দিয়েছি কারণ "ইউটিএফ -8 সক্ষম করা" এতটাই অস্পষ্ট ছিল। কিভাবে এবং কোথায় ইউনিকোড সমর্থন হুক করা যায় তা আমি খুঁজে পাইনি। এটি এত সময়সাপেক্ষ ছিল যে আমি পুরানো পথে যেতে আরও সহজ করেছিলাম। এখন আমি এখানে মেসন 2 এর সাথে একই সমস্যার মোকাবিলা করার জন্য একটি অনুগ্রহ পেয়েছিলাম : মেসন 2 ইউটিএফ -8 কীভাবে পরিষ্কার করব? । সুতরাং, এটি বেশ নতুন ফ্রেমওয়ার্ক, তবে এটি ইউটিএফ -8 ব্যবহার করে এর অভ্যন্তরগুলির গভীর জ্ঞান প্রয়োজন। এটি একটি বড় লাল চিহ্ন হিসাবে: থামুন, আমাকে ব্যবহার করবেন না!

আমি সত্যিই পার্ল পছন্দ করি। তবে ইউনিকোড নিয়ে কাজ করা বেদনাদায়ক। আমি এখনও নিজেকে দেওয়ালের বিরুদ্ধে দৌড়াতে দেখছি। কিছু উপায় tchrist অধিকার এবং আমার প্রশ্নের উত্তর দেয়: নতুন প্রকল্পের হল UTF-8 আকৃষ্ট না, কারণ এটা খুব পার্ল 5 জটিল না।


15
আমি দুঃখিত তবে আমি @ ট্রিস্টের সাথে একমত - ইউটিএফ -8 অত্যন্ত শক্ত is এমন কোনও ফ্রেমওয়ার্ক বা সরঞ্জাম নেই যা কেবল "একটি স্যুইচ ফ্লিপ করে" এবং তারপরে এটি সঠিকভাবে পরিচালনা করে। আপনার অ্যাপ্লিকেশনটি ডিজাইন করার সময় এটির জন্য আপনাকে সরাসরি ভাবতে হবে - কোনওরকম কাঠামো বা ভাষা আপনার পক্ষে পরিচালনা করতে পারে না। যদি রাকুডো কেবল আপনার জন্য কাজ করে, আপনি নিজের পরীক্ষার ক্ষেত্রে যথেষ্ট সাহসী ছিলেন না - কারণ এটি @ টক্রিস্টের উত্তর এবং কসাইয়ের কয়েকটি উদাহরণ গ্রহণ করবে।
বিলি ওনিল

12
আপনি কী আশা করছেন মুস বা আধুনিক :: পার্ল কী করবে? ফাইল এবং ডেটাবেজে এলোমেলোভাবে এনকোডযুক্ত অক্ষর ডেটা আবার বৈধ ডেটাতে ম্যাজিক্যালি তৈরি করবেন?
jrockway

13
ওটার মানে কি? মুজ পাঠ্যের হেরফেরের সাথে কোনও সম্পর্ক নেই। চরিত্রের এনকোডিং সম্পর্কে কেন এটি জানা উচিত, আপনার জন্য খুব কম কোনও ডিফল্ট চয়ন করে? (যাইহোক, আপনি যে প্রগমাগুলি তালিকাভুক্ত করেছেন তা এনকোডিংয়ের স্পর্শ না করার কারণ হ'ল কনভেনশনটি পার্ল প্রগমাদের লেক্সিকাল আচরণকে প্রভাবিত করার জন্য । এটি এখানে পিএইচপি বা রুবি নয়))
জারকওয়ে

8
(এছাড়াও ... "সর্বাধিক আধুনিক পার্ল অ্যাপ্লিকেশনগুলি" ইউটিএফ -8 এ বিভক্ত? আমি অবশ্যই কোনও অ্যাপ্লিকেশন, পার্ল বা অন্যথায়, এটি ইউনিকোড-ক্লিন নয়, কখনও
লিখিনি

11
নম্বর। টক্রিস্ট (টম ক্রিশ্চিয়ানসেন) ইউনিকোড সম্পর্কে তাঁর [ প্রশিক্ষণ. perl.com/OSCON2011/index.html টম ক্রিশ্চেনসনস এর সামগ্রীর জন্য ওসকন ২০১১] পোস্ট করেছেন। "ইউনিকোড সাপোর্ট শ্যুটআউট: দ্য গুড, দ্য ব্যাড, এবং (বেশিরভাগই) অগলি" শিরোনামের একটিতে বিভিন্ন প্রোগ্রামিং ভাষায় ইউনিকোড সমর্থন সম্পর্কে কথা বলা হয়েছে। কেবলমাত্র গুগল গো এবং পার্ল 5-এর সম্পূর্ণ ইউনিকোডের জন্য সমর্থন রয়েছে, কেবল গুগল গো বিল্টিন (পার্ল of এর উল্লেখ নেই)।
জাকুব নারেবস্কি

উত্তর:


1146

𝙎𝙞𝙢𝙥𝙡𝙚𝙨𝙩 : 𝟕 𝘿𝙞𝙨𝙘𝙧𝙚𝙩𝙚 𝙍𝙚𝙘𝙤𝙢𝙢𝙚𝙣𝙙𝙖𝙩𝙞𝙤𝙣𝙨

  1. আপনার PERL_UNICODEপ্রতিবেশী সেট করুন AS। এটি সমস্ত পার্ল স্ক্রিপ্টগুলি @ARGVইউটিএফ ‑ 8 টি স্ট্রিং হিসাবে ডিকোড করে তোলে এবং স্টিডিন, স্টডআউট এবং স্টার্ডার তিনটিই ইউটিএফ ‑ 8 এ এনকোডিং সেট করে। এগুলি উভয়ই বিশ্বব্যাপী প্রভাব, লাক্ষিক নয়।

  2. আপনার উত্স ফাইলের শীর্ষস্থানীয় (প্রোগ্রাম, মডিউল, গ্রন্থাগার, doহিকি), আপনি স্পষ্টতই দৃsert়ভাবে দাবি করুন যে আপনি পার্ল সংস্করণ 5.12 বা তার থেকে আরও ভালভাবে চালাচ্ছেন:

    use v5.12;  # minimal for unicode string feature
    use v5.14;  # optimal for unicode string feature
    
  3. সতর্কতাগুলি সক্ষম করুন, যেহেতু পূর্ববর্তী ঘোষণাপত্রটি কেবল সতর্কতা নয়, কঠোরতা এবং বৈশিষ্ট্যগুলিকে সক্ষম করে। আমি ইউনিকোড সতর্কতাগুলিকে ব্যতিক্রম হিসাবে প্রচার করার পরামর্শ দিচ্ছি, সুতরাং এই দুটি লাইনই কেবল ব্যবহার করুন, এর মধ্যে একটিও নয়। নোট তবে v5.14 অধীনে, utf8সতর্কবার্তা বর্গ তিনটি subwarnings যা সব আলাদাভাবে সক্ষম করা যাবে গঠিত: nonchar, surrogate, এবং non_unicode। এগুলি আপনি আরও বেশি নিয়ন্ত্রণের চেষ্টা করতে পারেন।

    use warnings;
    use warnings qw( FATAL utf8 );
    
  4. ঘোষণা করুন যে এই উত্স ইউনিটটি ইউটিএফ ‑ 8 হিসাবে এনকোড হয়েছে। যদিও একসময় এই প্রগমা অন্যান্য কাজ করত, এখন এটি একমাত্র এই একক উদ্দেশ্যে কাজ করে এবং অন্য কোনওটি নয়:

    use utf8;
  5. ঘোষণা করুন যে এই লেজিকাল স্কোপের মধ্যে কোনও ফাইল হ্যান্ডেল খোলে তবে অন্য কোথাও নয় যে স্ট্রিমটি ইউটিএফ ‑ 8 এ এনকোড হয়েছে তা ধরে না নেওয়া যদি না আপনি অন্যথায় বলেন। এইভাবে আপনি অন্য মডিউল বা অন্যান্য প্রোগ্রামের কোডকে প্রভাবিত করবেন না।

    use open qw( :encoding(UTF-8) :std );
  6. এর মাধ্যমে নামযুক্ত অক্ষরগুলি সক্ষম করুন \N{CHARNAME}

    use charnames qw( :full :short );
  7. আপনার যদি একটি DATAহ্যান্ডেল থাকে তবে অবশ্যই আপনাকে অবশ্যই এটির এনকোডিং সেট করতে হবে। আপনি যদি এটি ইউটিএফ 8 ডলার হতে চান তবে বলুন:

    binmode(DATA, ":encoding(UTF-8)");

অন্যান্য বিষয়গুলির অবশ্যই শেষ নেই যা দিয়ে আপনি অবশেষে নিজেকে উদ্বিগ্ন মনে করতে পারেন, তবে এই পদগুলির কিছুটা দুর্বল বোধের পরেও, "সবকিছুকে কেবলমাত্র ইউটিএফ ‑ 8 দিয়ে কাজ করা" করার রাষ্ট্রীয় লক্ষ্যটির পক্ষে আনুমানিক যথেষ্ট।

অন্য একটি প্রগমা, যদিও এটি ইউনিকোড সম্পর্কিত নয়, তা হ'ল:

      use autodie;

এটি দৃ strongly়ভাবে সুপারিশ করা হয়।

🐪🐫🐪 🌞 𝕲𝖔 𝕿𝖍𝖔𝖚 𝖆𝖓𝖉 𝕯𝖔 𝕷𝖎𝖐𝖊𝖜𝖎𝖘𝖊 🌞 🐪🐫🐪 🐁 🐁


🎁 🐪 𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊 𝖋𝖔𝖗 𝖀𝖓𝖎𝖈𝖔𝖉𝖊⸗𝕬𝖜𝖆𝖗𝖊 𝕮𝖔𝖉𝖊 🐪 🎁 🎁


আমার নিজস্ব বয়লারপ্লেট এই দিনগুলিতে দেখতে দেখতে ঝোঁক:

use 5.014;

use utf8;
use strict;
use autodie;
use warnings; 
use warnings    qw< FATAL  utf8     >;
use open        qw< :std  :utf8     >;
use charnames   qw< :full >;
use feature     qw< unicode_strings >;

use File::Basename      qw< basename >;
use Carp                qw< carp croak confess cluck >;
use Encode              qw< encode decode >;
use Unicode::Normalize  qw< NFD NFC >;

END { close STDOUT }

if (grep /\P{ASCII}/ => @ARGV) { 
   @ARGV = map { decode("UTF-8", $_) } @ARGV;
}

$0 = basename($0);  # shorter messages
$| = 1;

binmode(DATA, ":utf8");

# give a full stack dump on any untrapped exceptions
local $SIG{__DIE__} = sub {
    confess "Uncaught exception: @_" unless $^S;
};

# now promote run-time warnings into stack-dumped
#   exceptions *unless* we're in an try block, in
#   which case just cluck the stack dump instead
local $SIG{__WARN__} = sub {
    if ($^S) { cluck   "Trapped warning: @_" } 
    else     { confess "Deadly warning: @_"  }
};

while (<>)  {
    chomp;
    $_ = NFD($_);
    ...
} continue {
    say NFC($_);
}

__END__

𝕹 𝖔 𝕸 𝖆 𝖌 𝖈 𝖈 𝕭 𝖚 𝖑 𝖑 𝖊 𝖙 🎅


এই বলে যে "পার্লের উচিত [ কোনওভাবে! ] ডিফল্টরূপে ইউনিকোড সক্ষম করুন "এমনকি একরকম বিরল এবং বিচ্ছিন্ন ক্ষেত্রে কিছুটা প্রান্তিক উপযোগী হয়ে ওঠার বিষয়ে যথেষ্ট পরিমাণে বলার বিষয়ে ভাবনা শুরুও করে না। ইউনিকোড কেবল একটি বৃহত্তর চরিত্রের খণ্ডন থেকে অনেক বেশি; এই অক্ষরগুলি কীভাবে সমস্তগুলি বহু, বহু উপায়ে ইন্টারঅ্যাক্ট করে।

এমনকি সাধারণ-মনের ন্যূনতম পদক্ষেপ যা (কিছু) লোকেরা মনে করে যে তারা চায় তাদের লক্ষণীয়ভাবে কয়েক মিলিয়ন কোড, কোডের লঙ্ঘন করার নিশ্চয়তা দেওয়া হয়েছে যা আপনার মজাদার নতুন সাহসী নতুন বিশ্বের আধুনিকতায় "আপগ্রেড" করার কোনও সুযোগ নেই has

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

Un ইউনিকোডকে সহজ করে তোলার পথে চলে যায়, যা আমি এর আগে ব্যবহার করেছি তার চেয়ে অনেক বেশি। আপনি যদি এটি খারাপ বলে মনে করেন তবে কিছুক্ষণের জন্য অন্য কিছু চেষ্টা করুন। তারপরে come এ ফিরে আসুন: হয় আপনি উন্নত বিশ্বে ফিরে এসেছেন, না হলে আপনি নিজের সাথে একই জ্ঞান নিয়ে আসবেন যাতে আমরা আপনার নতুন জ্ঞানকে এই জিনিসগুলিতে আরও উন্নত করতে পারি।


𝕴𝖉𝖊𝖆𝖘 𝖋𝖔𝖗 𝖆 𝖀𝖓𝖎𝖈𝖔𝖉𝖊 ⸗ 𝕬𝖜𝖆𝖗𝖊 🐪 𝕷𝖆𝖚𝖓𝖉𝖗𝖞 𝕷𝖎𝖘𝖙 💡 💡


সর্বনিম্ন, এখানে এমন কিছু জিনিস রয়েছে যা "ডিফল্টরূপে ইউনিকোড সক্ষম করার" জন্য প্রয়োজনীয় হিসাবে উপস্থিত হতে পারে বলে মনে হচ্ছে:

  1. সমস্ত 🐪 উত্স কোডটি ডিফল্টরূপে UTF-8 এ থাকা উচিত। আপনি যে পেতে পারেন সঙ্গে use utf8বা export PERL5OPTS=-Mutf8

  2. 🐪 DATAহ্যান্ডেলটি ইউটিএফ -8 হওয়া উচিত। আপনাকে প্রতি প্যাকেজ ভিত্তিতে এটি করতে হবে, যেমন আছে binmode(DATA, ":encoding(UTF-8)")

  3. 🐪 স্ক্রিপ্টগুলিতে প্রোগ্রাম আর্গুমেন্টগুলি ডিফল্টরূপে UTF-8 হতে হবে। export PERL_UNICODE=A, বা perl -CA, বা export PERL5OPTS=-CA

  4. স্ট্যান্ডার্ড ইনপুট, আউটপুট এবং ত্রুটির স্ট্রিমগুলি ইউটিএফ -8 এ ডিফল্ট হওয়া উচিত। export PERL_UNICODE=Sতাদের সব, অথবা I, O, এবং / অথবা Eতাদের শুধু কিছু জন্য। এই মত perl -CS

  5. By দ্বারা খোলা অন্য কোনও হ্যান্ডেলগুলি ইউটিএফ -8 হিসাবে বিবেচনা করা উচিত যদি না অন্যথায় ঘোষণা করা হয়; export PERL_UNICODE=Dবা এইগুলির সাথে iএবং oনির্দিষ্টগুলির জন্য; export PERL5OPTS=-CDকাজ করবে এটি -CSADতাদের সবার জন্য তৈরি করে।

  6. উভয় ঘাঁটি প্লাস করে আপনি যে স্ট্রিম দিয়ে খোলেন সেগুলি Coverেকে দিন export PERL5OPTS=-Mopen=:utf8,:stdস্বতন্ত্র দেখুন ।

  7. আপনি ইউটিএফ -8 এনকোডিং ত্রুটি মিস করতে চান না। ব্যবহার করে দেখুন export PERL5OPTS=-Mwarnings=FATAL,utf8। এবং আপনার ইনপুট স্ট্রিম সবসময় হয় তা নিশ্চিত binmodeকরার জন্য ঘ :encoding(UTF-8), না শুধু :utf8

  8. 128-255 এর মধ্যে কোড পয়েন্টগুলি কেবল ইউনিকোড কোড পয়েন্ট হতে হবে, কেবল অবিকৃত বাইনারি মান নয় inary use feature "unicode_strings"বা export PERL5OPTS=-Mfeature=unicode_strings। এটি করবে uc("\xDF") eq "SS"এবং "\xE9" =~ /\w/। একটি সাধারণ export PERL5OPTS=-Mv5.12বা আরও ভাল এটি পাবেন।

  9. নামযুক্ত ইউনিকোড অক্ষরগুলি ডিফল্টরূপে সক্ষম হয় না, সুতরাং যুক্ত করুন export PERL5OPTS=-Mcharnames=:full,:short,latin,greekবা এর মতো কিছু। দেখুন uninames এবং tcgrep

  10. আপনার প্রায় সর্বদা স্ট্যান্ডার্ড Unicode::Normalizeমডিউল থেকে বিভিন্ন ধরণের পচে যাওয়া থেকে ফাংশনগুলি অ্যাক্সেস করা দরকার । export PERL5OPTS=-MUnicode::Normalize=NFD,NFKD,NFC,NFKD, এবং তারপরে সর্বদা NFD এর মাধ্যমে আগত সামগ্রী এবং এনএফসি থেকে আউটবাউন্ড স্টাফ চালান stuff এগুলির জন্য এখনও আমি / ও স্তর নেই যা আমি সচেতন, তবে এনএফসি , এনএফডি , এনএফকেডি এবং এনএফকেসি দেখুন

  11. মধ্যে 🐪 স্ট্রিং তুলনা ব্যবহার eq, ne, lc, cmp, sort, সি & CC সবসময় ভুল। পরিবর্তে @a = sort @b, আপনার প্রয়োজন @a = Unicode::Collate->new->sort(@b)। পাশাপাশি আপনার যোগ করতে পারেন export PERL5OPTS=-MUnicode::Collate। আপনি বাইনারি তুলনা করার জন্য কীটি ক্যাশে করতে পারেন।

  12. 🐪 বিল্ট-ইনগুলি ইউনিকোড ডেটা দিয়ে ভুল কাজ পছন্দ করে printfএবং writeকরে। আপনি ব্যবহার করতে হবে মডিউল সাবেক জন্য, এবং উভয় যে এবং মডিউল পরেরটির জন্য ভাল হিসাবে। দেখুন uwc এবং unifmtUnicode::GCStringUnicode::LineBreak

  13. আপনি তাদের ইন্টিজার যেমন গণনা করতে চান, তাহলে আপনি আপনার চালানোর আছে করতে যাচ্ছি \d+মাধ্যমে যেমনটি ফাংশন এর কারণ 🐪 বিল্ট-ইন আপনি atoi (3) বর্তমানে চালাক যথেষ্ট নয়।Unicode::UCD::num

  14. আপনার 👽 ফাইল সিস্টেমে ফাইল সিস্টেম সমস্যা রয়েছে। কিছু ফাইল সিস্টেম চুপচাপ এনএফসি-তে রূপান্তর কার্যকর করে; অন্যরা নিঃশব্দে NFD তে রূপান্তর কার্যকর করে। এবং অন্যরা এখনও অন্য কিছু করে। কিছু এমনকি বিষয়টি পুরোপুরি উপেক্ষা করে, যা আরও বেশি সমস্যার দিকে পরিচালিত করে। সুতরাং বুদ্ধিমান রাখতে আপনাকে নিজের এনএফসি / এনএফডি হ্যান্ডলিং করতে হবে।

  15. আপনার সবকটি 🐪 কোড জড়িত a-zবা A-Zএবং এই ধরনের আবশ্যক পরিবর্তন করা সহ m//, s///এবং tr///। আপনার কোডটি নষ্ট হয়ে গেছে এমন চিৎকারকারী লাল পতাকা হিসাবে এটি দাঁড়ানো উচিত। তবে এটি কীভাবে পরিবর্তন করতে হবে তা পরিষ্কার নয়। সঠিক সম্পত্তি অর্জন করা এবং তাদের কেসফোল্ডগুলি বোঝা আপনার পক্ষে ভাবার চেয়ে কঠিন। আমি প্রতিটি একক দিনে ইউনিকার এবং ইউনিকপ্রস ব্যবহার করি

  16. যে \p{Lu}কোডগুলি ব্যবহার করে সেগুলি কোড ব্যবহার করে এমন প্রায় ভুল [A-Za-z]\p{Upper}পরিবর্তে আপনাকে ব্যবহার করতে হবে এবং এর কারণটি জানতে হবে। হ্যাঁ, \p{Lowercase}এবং \p{Lower}থেকে ভিন্ন \p{Ll}এবং \p{Lowercase_Letter}

  17. যে [a-zA-Z]কোডগুলি ব্যবহার করে তা আরও খারাপ। এবং এটি ব্যবহার করতে পারে না \pLবা \p{Letter}; এটি ব্যবহার করা প্রয়োজন \p{Alphabetic}। সমস্ত বর্ণমালা অক্ষর নয়, আপনি জানেন!

  18. আপনি যদি with ভেরিয়েবলের সাথে সন্ধান করেন /[\$\@\%]\w+/তবে আপনার সমস্যা আছে। আপনার খোঁজ করা দরকার /[\$\@\%]\p{IDS}\p{IDC}*/, এমনকি এটি বিরামচিহ্নের ভেরিয়েবল বা প্যাকেজ ভেরিয়েবলগুলির বিষয়ে চিন্তাও করে না।

  19. আপনি যদি হোয়াইটস্পেসের জন্য যাচাই করে নিচ্ছেন তবে তার উপর নির্ভর করে আপনার মধ্যে \hএবং এর মধ্যে নির্বাচন করা উচিত \v। এবং আপনার কখনই ব্যবহার করা উচিত নয় \s, কারণ এটি জনপ্রিয় বিশ্বাসের বিপরীতে অর্থ বোঝায় না [\h\v]

  20. যদি আপনি \nকোনও লাইন সীমানা বা এমনকি জন্য ব্যবহার করে থাকেন \r\nতবে আপনি এটি ভুল করছেন। আপনাকে ব্যবহার করতে হবে \R, যা একই নয়!

  21. আপনি যদি জানেন না কখন এবং ইউনিকোড :: স্ট্রিংপ্রেপ কল করতে হবে , তবে আপনার আরও ভাল শিখতে হবে।

  22. কেস-সংবেদনশীল তুলনাগুলিতে দু'টি জিনিস একই বর্ণের কিনা তা নির্ধারণ করা দরকার যেগুলি তাদের ডায়াস্রিটিকস এবং এ জাতীয় কোনও বিষয় নয়। এটি করার সবচেয়ে সহজ উপায় হ'ল মানক ইউনিকোড :: কোলেট মডিউলটি দিয়ে। Unicode::Collate->new(level => 1)->cmp($a, $b)। এছাড়াও বিভিন্ন eqপদ্ধতি এবং এগুলি রয়েছে এবং আপনার সম্ভবত পদ্ধতি matchএবং substrপদ্ধতিগুলি সম্পর্কেও শিখতে হবে। এগুলি বিল্ট-ইনগুলির তুলনায় স্বতন্ত্র সুবিধা রয়েছে।

  23. কখনও কখনও এটি এখনও পর্যাপ্ত নয়, এবং আপনার পরিবর্তে ইউনিকোড :: কোলেট :: লোকেল মডিউলটি প্রয়োজন Unicode::Collate::Locale->new(locale => "de__phonebook", level => 1)->cmp($a, $b)। বিবেচনা করুন যে Unicode::Collate::->new(level => 1)->eq("d", "ð")সত্য, কিন্তু Unicode::Collate::Locale->new(locale=>"is",level => 1)->eq("d", " ð")মিথ্যা। একইভাবে, "আইই" এবং "æ" হ'ল eqযদি আপনি লোকেল ব্যবহার না করেন, বা আপনি যদি ইংরেজি ব্যবহার করেন তবে আইসল্যান্ডীয় লোকালে সেগুলি আলাদা। এখন কি? আমি আপনাকে বলি, এটা শক্ত। আপনি এর কিছু পরীক্ষা করে দেখার জন্য ইউকোর্টের সাথে খেলতে পারেন ।

  24. কিভাবে প্যাটার্ন CVCV মেলে STRING "এর মধ্যে (consonsant, স্বরবর্ণ ব্যঞ্জনবর্ণ, স্বরবর্ণ) বিবেচনা করুন নিনো "। এর এনএফডি ফর্ম - যা আপনি ভালভাবে ঘৃণা করেছিলেন তা এটিকে মনে রাখার জন্য - এটি "নিিন \ x {303} o" হয়ে যায়। এখন আপনি কি করতে যাচ্ছেন? এমন কি ভান করে যে একটি স্বর [aeiou](যা ভুল, উপায়), আপনি (?=[aeiou])\X)কোনওটির মতো কিছু করতে সক্ষম হবেন না , কারণ এনএফডিতে এমনকি 'ø' এর মতো কোড পয়েন্টও ক্ষয় হয় না ! যাইহোক, এটি ইউসিএ তুলনা আমি আপনাকে কেবল দেখিয়ে ব্যবহার করে একটি 'ও' এর সমান পরীক্ষা করব। আপনি এনএফডির উপর নির্ভর করতে পারবেন না, আপনাকে ইউসিএর উপর নির্ভর করতে হবে।


𝔸 𝕤 𝕤 𝕦 𝕞 𝕖 𝔹 𝕣 𝕠 𝕜 𝕖 𝕟 𝕖 𝕖 𝕤 𝕤


এবং এটি সব নয়। ইউনিকোড সম্পর্কে লোকেরা যে এক মিলিয়ন ভাঙ্গা অনুমান করে থাকে। যতক্ষণ না তারা এই জিনিসগুলি বোঝে, তাদের their কোডটি ভেঙে যাবে।

  1. কোড অনুমান করে যে এটি এনকোডিং নষ্ট হয়েছে তা উল্লেখ না করে কোনও পাঠ্য ফাইল খুলতে পারে।

  2. ডিফল্ট এনকোডিং ধরে নেওয়া কোডটি একরকম স্থানীয় প্ল্যাটফর্মের এনকোডিংটি ভেঙে গেছে।

  3. যে কোডটি ধরে নিয়েছে যে জাপানি বা চীনা ভাষায় ওয়েব পৃষ্ঠাগুলি ইউটিএফ ‑ 8 এর তুলনায় ইউটিএফ ‑ 16 এর চেয়ে কম জায়গা নেয় তা ভুল।

  4. পার্ল অভ্যন্তরীণভাবে ইউটিএফ ‑ 8 ব্যবহার করে বলে ধরে নেওয়া কোডটি ভুল।

  5. কোড যা ধরে নিয়েছে যে এনকোডিং ত্রুটিগুলি সর্বদা একটি ব্যতিক্রম উত্থাপন করবে তা ভুল।

  6. পার্ল কোড পয়েন্টগুলি 0x10_FFFF এর মধ্যে সীমাবদ্ধ বলে ধরেছে এমন কোডটি ভুল।

  7. কোড যা ধরে নিয়েছে যে $/আপনি এমন কিছুতে সেট করতে পারেন যা কোনও বৈধ লাইন বিভাজকের সাথে কাজ করবে তা ভুল।

  8. কোডফোল্ডিংয়ের ক্ষেত্রে রাউন্ডট্রিপ সাম্যাকে ধরে রাখে এমন কোড, যেমন lc(uc($s)) eq $sবা uc(lc($s)) eq $s, সম্পূর্ণরূপে ভাঙা এবং ভুল। বিবেচনা করুন যে uc("σ")এবং uc("ς") উভয়ই "Σ", তবে lc("Σ")সম্ভবত তারা দুটিকেই ফিরিয়ে দিতে পারে না।

  9. প্রতিটি ছোট হাতের কোড পয়েন্ট ধরে এমন কোডটি পৃথক বড় হাতের অক্ষর বা বিপরীতে বিভক্ত হয়ে গেছে। উদাহরণস্বরূপ, "ª"বড় হাতের অক্ষর একটি বড় হাতের অক্ষর নয়; যদিও উভয় "ᵃ"এবং "ᴬ"অক্ষর, তবে সেগুলি ছোট হাতের অক্ষর নয়; তবে, এগুলি উভয়ই ছোট ছোট অক্ষরের অক্ষর অনুসারে বড় আকারের সংস্করণ ছাড়াই। বুঝেছি? তারা উভয় এবং সত্ত্বেও না\p{Lowercase_Letter}\p{Letter}\p{Lowercase}

  10. কেসটি পরিবর্তনটি ধরে নিয়েছে যে কেস পরিবর্তন করা হচ্ছে স্ট্রিংয়ের দৈর্ঘ্যটি ভেঙে যায় না।

  11. যে কোডটি ধরে নিয়েছে সেখানে দুটি মাত্র মামলা রয়েছে তা ভেঙে গেছে। শিরোনাম আছে।

  12. যে কোডটি কেবলমাত্র অক্ষরের ক্ষেত্রেই ধরা হয়েছে তা ভেঙে গেছে। কেবলমাত্র অক্ষরের বাইরে, এটি প্রমাণ করে যে সংখ্যা, চিহ্ন এবং এমনকি চিহ্নগুলির ক্ষেত্রে আছে। প্রকৃতপক্ষে, কেস পরিবর্তন করা কিছুকে এর প্রধান সাধারণ বিভাগে পরিবর্তন করতে পারে, যেমন একটি তে \p{Mark}পরিণত হওয়ার মতো \p{Letter}। এটি এটিকে একটি স্ক্রিপ্ট থেকে অন্য স্ক্রিপ্টে স্যুইচ করতে পারে।

  13. কোডটি ধরে নেয় যে কেসটি কখনই লোকাল-নির্ভর নয় broken

  14. ইউনিকোডের ধারনা কোডটি পসিক্স লোকেলগুলি ভাঙ্গা সম্পর্কে একটি চিত্র দেয়।

  15. যে কোডটি ধরে নিয়েছে যে আপনি ASCII অক্ষরকে বেসে ডায়রিটিক্সগুলি মুছে ফেলতে পারেন তা হ'ল মন্দ, স্থির, ভাঙ্গা, মস্তিষ্কে ক্ষতিগ্রস্থ, ভুল, এবং মৃত্যুদণ্ডের শাস্তির ন্যায়সঙ্গততা।

  16. কোড যা ধরে নিয়েছে যে ডায়াক্রিটিক্স \p{Diacritic}এবং চিহ্নগুলি \p{Mark}একই জিনিসটি ভেঙে গেছে।

  17. যে কোডটি ধরে নিয়েছে তা ভেঙে গেছে \p{GC=Dash_Punctuation}covers\p{Dash}

  18. কোড যা ড্যাশ, হাইফেন এবং বিয়োগগুলি একে অপরের মতো একই জিনিস হিসাবে ধরে নিয়েছে বা প্রত্যেকটির মধ্যে একটি মাত্র রয়েছে তা ভঙ্গ এবং ভুল।

  19. কোড যা প্রতিটি কোড পয়েন্ট ধরে নেয় একের বেশি মুদ্রণ কলামটি ভাঙা হয় না।

  20. এমন কোড যা ধরে নিয়েছে যে সমস্ত \p{Mark}অক্ষর শূন্য প্রিন্ট কলামগুলি গ্রহণ করেছে তা নষ্ট হয়ে গেছে।

  21. কোড অনুমান যে অক্ষর যা একইভাবে চেহারা হয় একইভাবে নষ্ট হয়ে গেছে।

  22. কোড অনুমান যে অক্ষর যা না না একইভাবে চেহারা হয় না একইভাবে নষ্ট হয়ে গেছে।

  23. যে কোডটি ধরে নিয়েছে যে একক সারিতে কোড পয়েন্টের সীমা রয়েছে যা কেবল একটির সাথে \Xমেলে তা ভুল।

  24. কোডটি ধরে নিয়েছে যে \Xকোনও \p{Mark}অক্ষর দিয়ে কখনই শুরু করা যায় না এটি ভুল।

  25. এমন কোড যা ধরে নিয়েছে যে \Xকখনই দুটি \p{Mark}অক্ষর রাখতে পারে না তা ভুল।

  26. যে কোডটি ধরে নিয়েছে যে এটি ব্যবহার করতে পারে না "\x{FFFF}"তা ভুল।

  27. কোড যা একটি নন-বিএমপি কোড পয়েন্ট ধরেছে যার জন্য দুটি ইউটিএফ -16 (সারোগেট) কোড ইউনিট দুটি পৃথক ইউটিএফ -8 অক্ষরে এনকোড করবে, কোড প্রতি ইউনিট, একটি ভুল। এটি করে না: এটি একক কোড পয়েন্টে এনকোড করে।

  28. যে কোডটি ইউটিএফ U 16 বা ইউটিএফ ‐ 32 থেকে শীর্ষস্থানীয় বিওএমগুলি সাথে ইউটিএফ ‐ 8 এ ট্রান্সকোড করে তা যদি ভেঙে যায় তবে ফলস্বরূপ ইউটিএফ -8 শুরুতে একটি বিওএম রাখে। এটি এত নির্বোধ যে ইঞ্জিনিয়ারের তাদের চোখের পাতাটি সরানো উচিত।

  29. সিইএসইউ -8 ধরে নেওয়া কোডটি একটি বৈধ ইউটিএফ এনকোডিং ভুল। তেমনি, যে কোডটি "\xC0\x80"ইউটিএফ -8 হিসাবে ইউ + 0000 এনকোডিং করে তা ভাঙ্গা এবং ভুল। এই ছেলেরাও চোখের পাতার চিকিত্সা প্রাপ্য।

  30. কোড যা >সর্বদা ডানদিকে <নির্দেশ করে এবং বাম দিকে সর্বদা পয়েন্টগুলি পছন্দ করে এমন কোডগুলি ভুল - কারণ তারা আসলে তা করে না।

  31. কোডটি ধরে নিয়েছে যে আপনি যদি প্রথমে অক্ষর Xএবং তারপরে অক্ষর বের করেন তবে Yসেগুলি XYভুল হিসাবে দেখাবে । কখনও কখনও তারা না।

  32. যে কোডটি ধরে নিয়েছে যে এএসসিআইআই সঠিকভাবে ইংরেজি লেখার পক্ষে যথেষ্ট তা বোকা, সংক্ষিপ্ত, নিরক্ষর, ভাঙ্গা, মন্দ এবং ভুল। তাদের মাথা দিয়ে বন্ধ! যদি এটি খুব চরম মনে হয় তবে আমরা আপস করতে পারি: এর পরে তারা কেবল তাদের পা থেকে কেবল একটি পা দিয়ে টাইপ করতে পারে। (বাকিগুলি নালী টেপ করা হবে))

  33. কোড যা ধরে নিয়েছে যে সমস্ত \p{Math}কোড পয়েন্ট দৃশ্যমান অক্ষরগুলি ভুল।

  34. যে কোডটি ধরে নিয়েছে \wকেবলমাত্র অক্ষর, সংখ্যা এবং আন্ডারস্কোরগুলি ভুল।

  35. এমন কোড যা ধরে নিয়েছে ^এবং ~বিরাম চিহ্নগুলি ভুল wrong

  36. üএমন একটি কোড যা ধরে নেয় যে একটি আমলাট ভুল।

  37. কোড যা বিশ্বাস করে যেগুলিতে কোনও অক্ষর রয়েছে এমন জিনিসগুলি ভুল।

  38. বিশ্বাসযোগ্য কোডটি \p{InLatin}একইরকমভাবে \p{Latin}ভেঙে গেছে।

  39. কোড যে বিশ্বাস করে যে \p{InLatin}প্রায় কার্যকর হয় প্রায় অবশ্যই ভুল।

  40. যে কোডটি বিশ্বাস করে যে $FIRST_LETTERকোনও বর্ণমালায় প্রথম অক্ষর $LAST_LETTERহিসাবে এবং সেই একই বর্ণমালার শেষ অক্ষর হিসাবে দেওয়া [${FIRST_LETTER}-${LAST_LETTER}]হয়েছে , এর কোনও অর্থ আছে যা প্রায় সর্বদা সম্পূর্ণ ভাঙ্গা এবং ভুল এবং অর্থহীন।

  41. কোড যা বিশ্বাস করে যে কারওর নামের মধ্যে কিছু নির্দিষ্ট অক্ষর থাকতে পারে সেগুলি বোকা, আপত্তিকর এবং ভুল।

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

  43. কোড যা বিশ্বাস করে যে টেক্সটফিল এনকোডিংগুলি উপস্থিত নেই তা ভান করার কিছু উপায় রয়েছে ভঙ্গ এবং বিপজ্জনক। পাশাপাশি অন্য চোখও ঠোকরানো হতে পারে।

  44. অজানা অক্ষরগুলিকে রূপান্তর করে এমন কোডটি ?ভাঙ্গা, বোকা, ব্রেইনডেড এবং মানদণ্ডের সুপারিশের বিপরীতে চলে, যা না করতে বলে ! আরটিএফএম কেন নেই তার জন্য।

  45. যে কোডটি বিশ্বাস করে এটি নির্ভরযোগ্যভাবে অনুমান করতে পারে যে একটি চিহ্নযুক্ত পাঠ্য ফাইলের এনকোডিং হুব্রিস এবং নাভেটির মারাত্মক মেলানজ জন্য দোষী যে জিউস থেকে কেবল একটি বিদ্যুতের বোল্ট ঠিক হয়ে যাবে।

  46. কোড যা বিশ্বাস করে যে আপনি printfইউনিকোড ডেটা প্যাড করতে এবং ন্যায়সঙ্গত করতে 🐪 প্রস্থগুলি ব্যবহার করতে পারেন ভাঙ্গা এবং ভুল।

  47. কোড যা বিশ্বাস করে যে আপনি একবার কোনও প্রদত্ত নাম দ্বারা সফলভাবে একটি ফাইল তৈরি করেন, আপনি যখন চালনা করেন lsবা readdirএর সংলগ্ন ডিরেক্টরিতে, আপনি আসলে সেই ফাইলটি আপনার নীচে তৈরি করা বগী, ভাঙা, এবং ভুল খুঁজে পাবেন। এতে অবাক হওয়া বন্ধ করুন!

  48. ইউটিএফ -16 বিশ্বাস করে এমন কোডটি একটি নির্দিষ্ট-প্রস্থের এনকোডিংটি বোকা, ভাঙ্গা এবং ভুল। তাদের প্রোগ্রামিং লাইসেন্স প্রত্যাহার করুন।

  49. যে কোডটি একটি বিমান থেকে কোড পয়েন্ট হিসাবে বিবেচনা করে অন্য কোনও প্লেনের চেয়ে আলাদা আলাদা আলাদা আলাদা আইপসো ফ্যাক্টো এবং ভুল broken স্কুলে ফিরে যাও.

  50. কোড যা বিশ্বাস করে যে স্টাফগুলি /s/iকেবল মেলতে পারে "S"বা "s"ভঙ্গ এবং ভুল। আপনি অবাক হবেন।

  51. \PM\pM*গ্রাফি ক্লাস্টারগুলি ব্যবহারের পরিবর্তে সন্ধান করার জন্য কোডটি \Xভাঙ্গা এবং ভুল।

  52. যে সমস্ত মানুষ ASCII বিশ্বে ফিরে যেতে চায় তাদের তাদের আন্তরিকভাবে তা করতে উত্সাহিত করা উচিত এবং তাদের গৌরবময় আপগ্রেডের সম্মানে তাদের সমস্ত ডেটা-প্রবেশের প্রয়োজনীয়তার জন্য প্রাক-বৈদ্যুতিক ম্যানুয়াল টাইপরাইটার সহ বিনামূল্যে প্রদান করা উচিত । তাদের পাঠানো বার্তাগুলি প্রতি লাইনে 40 টি অক্ষরে একটি টেলিগ্রাফের মাধ্যমে এবং কুরিয়ারের মাধ্যমে হস্তান্তর করা উচিত। বন্ধ করুন।


𝕾 𝖀 𝕸 𝕸 𝕬 𝕽 𝖄 😱 😱


আমি জানি না যে আমি যেটা লিখেছি তার চেয়ে বেশি "ডিফল্ট ইউনিকোড 🐪" পেতে পারেন। ঠিক আছে, হ্যাঁ আমি করি: আপনারও ব্যবহার করা উচিত Unicode::Collateএবং Unicode::LineBreakতাও। এবং সম্ভবত আরও।

আপনি দেখুন, সেখানে পর্যন্ত অনেক ইউনিকোড বিষয় আছে যা সত্যিই আপনি কি সম্পর্কে সেখানে করার জন্য চিন্তা করতে হবে কি কখনো হিসাবে "ইউনিকোড ডিফল্ট" এই ধরনের কোন জিনিস বিদ্যমান।

আপনি যা আবিষ্কার করতে যাচ্ছেন, ঠিক যেমনটি আমরা 🐪 5.8 এ ফিরে এসেছি, কেবল কোডটি এই সমস্ত জিনিস চাপিয়ে দেওয়া অসম্ভব যেগুলি তাদের জন্য অ্যাকাউন্ট করার জন্য প্রথম থেকেই ডিজাইন করা হয়নি। আপনার সদর্থক স্বার্থপরতা কেবল পুরো বিশ্বকে ভেঙে দিয়েছে।

এমনকি একবার করার পরেও, এখনও সমালোচনামূলক সমস্যা রয়েছে যেগুলির সঠিক হওয়ার জন্য প্রচুর চিন্তাভাবনা করা দরকার। আপনি পাল্টাতে পারেন এমন কোনও সুইচ নেই। মস্তিষ্ক ছাড়া আর কিছুই নয়, এবং আমি বলতে চাইছি সত্যিকারের মস্তিষ্ক এখানে যথেষ্ট হবে। আপনাকে শিখতে হবে প্রচুর স্টাফের হেক। ম্যানুয়াল টাইপ রাইটারের পশ্চাদপসরণ মডুলো, আপনি কেবল অজ্ঞতার দ্বারা ছিঁচকে দেখার আশা করতে পারেন না। এটি 21-শতাব্দী, এবং আপনি ইচ্ছাকৃত অজ্ঞতার দ্বারা ইউনিকোডকে দূরে রাখতে চান না।

আপনি এটি শিখতে হবে। সময়কাল। এটি এত সহজ কখনও হবে না যে "সমস্ত কিছু কেবলমাত্র কাজ করে", কারণ এটি গ্যারান্টি দেয় যে অনেক কিছুই কাজ করে না - যা এই ধারণাটিকে অকার্যকর করে যে "এটি সমস্ত কাজ করার উপায়" কখনও পাওয়া যেতে পারে।

আপনি খুব অল্প কিছু এবং খুব সীমাবদ্ধ ক্রিয়াকলাপের জন্য কয়েকটি যুক্তিসঙ্গত খেলাপি পেতে সক্ষম হতে পারেন, তবে আমার কাছে যা ভাবেন তার চেয়ে বেশি কিছু নিয়ে চিন্তা না করেই নয়।

কেবল একটি উদাহরণ হিসাবে, ক্যানোনিকাল ক্রম কিছু বাস্তব মাথাব্যথার কারণ হতে চলেছে। 😭 "\x{F5}" 'õ' , "o\x{303}" 'õ' , "o\x{303}\x{304}" 'ȭ' , এবং "o\x{304}\x{303}" 'ō̃' সব মিলিয়ে 'õ' হওয়া উচিত তবে আপনি কীভাবে বিশ্বে এটি করতে চলেছেন? এটি দেখতে দেখতে তার চেয়ে শক্ত, তবে এটিই আপনার অ্যাকাউন্ট করতে হবে। 💣

পার্ল সম্পর্কে আমি যদি একটি জিনিস জানতে পারি তবে এটির ইউনিকোড বিটগুলি যা করে এবং না করে তা হ'ল এবং এই জিনিসটি আমি আপনাকে প্রতিশ্রুতি দিচ্ছি: "̲ɪ̲ ̲ɪ̲s̲ ̲ɴ̲ᴏ̲ ̲U̲ɴ̲ɪ̲ᴄ̲ᴏ̲ᴅ̲ᴇ̲ ̲ᴍ̲ᴀ̲ɢ̲ɪ̲ᴄ̲ ̲ʙ̲ᴜ̲ʟ̲ʟ̲ᴇ̲ᴛ̲ ̲" 😞

আপনি কেবল কিছু ডিফল্ট পরিবর্তন করতে পারবেন না এবং মসৃণ নৌযানটি পেতে পারেন। এটি সত্য যে আমি PERL_UNICODEসেট দিয়ে চালাচ্ছি। "SA"তবে এটি সবই এবং এমনকি এটি বেশিরভাগই কমান্ড-লাইন স্টাফের জন্য। সত্যিকারের কাজের জন্য, আমি উপরে বর্ণিত সমস্ত ধাপগুলি অতিক্রম করি এবং আমি এটি খুব ** খুব ** সাবধানে করি।


¡Ƨdləɥ ƨᴉɥʇ ədoɥ puɐ ʻλɐp əɔᴉu ɐ əʌɐɥ lnl poo⅁


56
শেরম পেন্ডলি পছন্দ করেছেন: "সমস্ত!"। আমি যদি আজকে নতুন কিছু লিখি, UTF-8 এ কাজগুলি করার সহজতম উপায় হওয়া উচিত । এইটা না. আপনার বয়লারপ্লেট এটি প্রোকস করে। এতগুলি গণ্ডগোলকে সঠিক অবস্থানে পরিণত করার মতো জ্ঞান প্রত্যেকেরই নেই। আমি দুঃখিত, আমার দীর্ঘ এবং কঠোর দিন ছিল, তাই আমি আগামীকাল প্রধান প্রবেশে উদাহরণ সহ আরও মন্তব্য করব।
ডব্লিউ কে

17
উপরের তালিকাটি পড়া থেকে একটি উপসংহারটি স্পষ্ট হওয়া উচিত: কেস-ভাঁজ করবেন না। শুধু না। কখনো। গুণগতভাবে ব্যয়বহুল এবং শব্দার্থবিজ্ঞানের সাথে এটি "লোকেল" সনাক্তকরণে ব্যর্থ চেষ্টা করে যা কিছু নির্ভর করে তা নির্ভর করে।
টিম ব্রে

72
আমি কি কেবলমাত্র এটাকেই হাস্যকর মনে করি যে টচারিস্টের এই পোস্টটি এফএফ / ক্রোম / আইই / অপেরাতে কিছুটা অবাস্তবতার মতো আলাদাভাবে রেন্ডার করে?
ক্ষয়ক্ষতি

15
আমি সাধারণত পোস্টটি পছন্দ করি, এবং উত্সাহ দেওয়ার সময়, একটি জিনিস আমার কাছ থেকে দূরে সরে যায়। অনেকগুলি "কোড যা ... ভাঙা" আছে। আমি বিবৃতি দিয়ে তর্ক না করলেও আমি মনে করি ভাঙাভাবটি দেখানো ভাল হবে। এইভাবে এটি কোনও অভিজাত থেকে শিক্ষার দিকে (উত্তরের এই অংশ) অতিক্রম করবে।

36
@xenoterracide না আমি ইচ্ছাকৃতভাবে সমস্যাযুক্ত কোড পয়েন্ট ব্যবহার করি নি; এটি আপনাকে জর্জ ডুরাস-এর দুর্দান্ত-দুর্দান্ত সিম্বোলা ফন্ট ইনস্টল করার জন্য একটি চক্রান্ত যা ইউনিকোড .0.০ জুড়ে। D @ ডেপিজ এখানে প্রতিটি ভাঙ্গা অনুমান কেন ভুল তা বোঝানোর জন্য এখানে কোনও স্থান নেই। @ লেওনব্লয় প্রচুর এবং এগুলি প্রচুর পরিমাণে ইউনিকোডে প্রয়োগ হয়, কেবল পার্লের জন্য নয়। এই উপাদানগুলির মধ্যে কিছু অক্টোবরে due প্রোগ্রামিং পার্ল 🐪 চতুর্থ সংস্করণে প্রদর্শিত হতে পারে। On আমার এক মাস বাকি আছে on এটিতে কাজ করতে, এবং ইউনিকোড রয়েছে; রেজেক্সেস, খুব
tchrist

96

ইউনিকোড পাঠ্য প্রক্রিয়াকরণের দুটি স্তর রয়েছে are প্রথমটি হ'ল "আমি কীভাবে এটি ইনপুট করতে পারি এবং তথ্য হারানো ছাড়া এটি আউটপুট করতে পারি"। দ্বিতীয়টি হ'ল "স্থানীয় ভাষার সম্মেলন অনুসারে আমি কীভাবে পাঠ্যের সাথে আচরণ করব"।

tchrist এর পোস্ট উভয়ই কভার, কিন্তু দ্বিতীয় অংশটি যেখানে তার পোস্টে লেখা 99% এসেছে। বেশিরভাগ প্রোগ্রামগুলি আই / ওকেও সঠিকভাবে পরিচালনা করে না, সুতরাং আপনার এমনকি স্বাভাবিককরণ এবং কোলেশন সম্পর্কে চিন্তা করা শুরু করার আগে এটি বুঝতে গুরুত্বপূর্ণ।

এই পোস্টটি প্রথম সমস্যাটি সমাধান করার লক্ষ্য নিয়েছে

আপনি যখন পার্লে ডেটা পড়েন তখন এটিকে কী এনকোডিং করা হয় তা বিবেচ্য নয়। এটি কিছু স্মৃতি বরাদ্দ করে এবং বাইটগুলি দূরে সরিয়ে দেয়। যদি আপনি বলেন print $str, এটি কেবল আপনার টার্মিনালে to বাইটগুলি অন্ধ করে দেয়, যা সম্ভবত এটিতে লেখা সমস্ত কিছুই ইউটিএফ -8 হিসাবে ধরে নিবে এবং আপনার পাঠ্যটি প্রদর্শিত হবে।

অবিশ্বাস্য।

ব্যতীত, তা নয়। আপনি যদি ডেটাটিকে পাঠ্য হিসাবে বিবেচনা করার চেষ্টা করেন তবে দেখবেন কিছুটা খারাপ হচ্ছে Bad lengthপার্ল আপনার স্ট্রিং সম্পর্কে কী চিন্তা করে এবং আপনার স্ট্রিং সম্পর্কে আপনি কী ভাবেন সে সম্পর্কে এটি দেখার দরকার নেই । ওয়ান-লাইনারের মতো লিখুন: perl -E 'while(<>){ chomp; say length }'টাইপ করুন 文字化けএবং আপনি 12 পেয়ে যাবেন ... সঠিক উত্তর নয়, 4।

এর কারণ পার্ল ধরে নেয় যে আপনার স্ট্রিংটি পাঠ্য নয়। আপনাকে এটি বলতে হবে যে এটি সঠিক উত্তর দেওয়ার আগে এটি পাঠ্য।

এটি যথেষ্ট সহজ; এনকোড মডিউলটির এটি করার জন্য ফাংশন রয়েছে। জেনেরিক এন্ট্রি পয়েন্টটি Encode::decode(বা use Encode qw(decode)অবশ্যই)। এই ফাংশনটি বাইরের বিশ্ব থেকে কিছু স্ট্রিং নেয় (যা আমরা "অক্টেটস" বলি, "8-বিট বাইট" বলার অভিনব উপায়) এবং এটিকে এমন কিছু পাঠ্যে পরিণত করে যা পার্ল বুঝতে পারবে। প্রথম যুক্তি হ'ল "ইউটিএফ -8" বা "এএসসিআইআই" বা "ইইউসি-জেপি" এর মতো একটি অক্ষর এনকোডিংয়ের নাম। দ্বিতীয় যুক্তিটি স্ট্রিং। ফেরতের মানটি হ'ল পাঠ্যযুক্ত পার্ল স্কেলার ala

(এছাড়াও রয়েছে Encode::decode_utf8, যা এনকোডিংয়ের জন্য ইউটিএফ -8 অনুমান করে))

যদি আমরা আমাদের ওয়ান-লাইনটিকে আবার লিখি:

perl -MEncode=decode -E 'while(<>){ chomp; say length decode("UTF-8", $_) }'

আমরা 文字 化 け টাইপ করি এবং ফলাফল হিসাবে "4" পাই। সাফল্য।

এটি ঠিক এখনই, পার্লের ইউনিকোডের 99% সমস্যার সমাধান।

মূলটি হ'ল যখনই কোনও প্রোগ্রাম আপনার প্রোগ্রামে আসে তখন আপনাকে অবশ্যই এটি ডিকোড করতে হবে। ইন্টারনেট অক্ষর স্থানান্তর করতে পারে না। ফাইলগুলি অক্ষর সংরক্ষণ করতে পারে না। আপনার ডাটাবেসে কোনও অক্ষর নেই। এখানে কেবলমাত্র অক্টেট রয়েছে এবং আপনি পার্টের অক্ষর হিসাবে অক্টেটগুলি আচরণ করতে পারবেন না। আপনাকে অবশ্যই এনকোডযুক্ত অক্টেটগুলি এনকোড মডিউল দিয়ে পার্ল অক্ষরে ডিকোড করতে হবে।

সমস্যার অর্ধেকটি আপনার প্রোগ্রামের বাইরে ডেটা পেয়ে যাচ্ছে। এটি সহজ; আপনি শুধু বলতে use Encode qw(encode)ঠিক কি আপনার ডেটা এনকোডিং (টার্মিনাল যে হল UTF-8, হল UTF-16 Windows এ ফাইলের জন্য, ইত্যাদি বুঝতে হল UTF-8) মধ্যে হতে হবে, এবং তারপর আউটপুট ফলাফলের encode($encoding, $data)শুধু outputting পরিবর্তে $data

এই অপারেশনটি পার্লের চরিত্রগুলিকে রূপান্তর করে যা আপনার প্রোগ্রামটি যা পরিচালনা করে তা বাইরের বিশ্বের দ্বারা ব্যবহার করা যেতে পারে oc এটি কেবলমাত্র আমরা ইন্টারনেটে বা আমাদের টার্মিনালগুলিতে অক্ষরগুলি প্রেরণ করতে পারলে এটি অনেক সহজ হবে, তবে আমরা এটি করতে পারি না: কেবলমাত্র অক্টেটস। সুতরাং আমাদের অক্ষরকে অষ্টেটে রূপান্তর করতে হবে, অন্যথায় ফলাফলগুলি সংজ্ঞায়িত।

সংক্ষিপ্তসার হিসাবে: সমস্ত আউটপুট এনকোড করুন এবং সমস্ত ইনপুট ডিকোড করুন।

এখন আমরা তিনটি বিষয় নিয়ে কথা বলব যা এটিকে সামান্য চ্যালেঞ্জিং করে তোলে। প্রথমটি গ্রন্থাগার। তারা কি সঠিকভাবে পাঠ্য পরিচালনা করে? উত্তরটি ... তারা চেষ্টা করে। আপনি যদি কোনও ওয়েব পৃষ্ঠা ডাউনলোড করেন তবে এলডাব্লুপি আপনার ফলাফলটিকে পাঠ্য হিসাবে ফিরিয়ে দেবে। যদি আপনি ফলাফলটিতে সঠিক পদ্ধতিটি কল করেন, তা হ'ল (এবং এটি হ'ল, এটি হ'ল decoded_contentনা contentযা সার্ভার থেকে পাওয়া অক্টেট স্ট্রিম)) ডাটাবেস ড্রাইভাররা অস্থির হতে পারে; আপনি যদি কেবল পার্ল দিয়ে ডিবিডি :: এসকিউএলাইট ব্যবহার করেন তবে এটি কার্যকর হবে, তবে অন্য কোনও সরঞ্জাম যদি আপনার ডাটাবেসে ইউটিএফ -8 ব্যতীত অন্য কোনও এনকোডিং হিসাবে পাঠ্য সঞ্চিত করে রাখে ... ভাল ... এটি সঠিকভাবে পরিচালনা করা হবে না যতক্ষণ না আপনি এটিকে সঠিকভাবে পরিচালনা করতে কোড লিখেন।

আউটপুটটিং ডেটা সাধারণত সহজ হয় তবে আপনি যদি "প্রিন্টে বিস্তৃত অক্ষর" দেখেন তবে আপনি জানেন যে আপনি কোথাও এনকোডিংয়ের সাথে ঝামেলা করছেন। এই সতর্কতার অর্থ "আরে, আপনি পার্ল চরিত্রগুলি বহির্বিশ্বে ফাঁস করার চেষ্টা করছেন এবং এটি কোনও অর্থবোধ করে না"। আপনার প্রোগ্রামটি কাজ করে বলে মনে হচ্ছে (কারণ অন্য প্রান্তটি সাধারণত কাঁচা পার্ল অক্ষরগুলি সঠিকভাবে পরিচালনা করে) তবে এটি খুব ভাঙ্গা এবং কোনও মুহুর্তে কাজ বন্ধ করে দিতে পারে। একটি সুস্পষ্ট সঙ্গে এটি ঠিক করুন Encode::encode!

দ্বিতীয় সমস্যাটি ইউটিএফ -8 এনকোডেড উত্স কোড। আপনি use utf8প্রতিটি ফাইলের শীর্ষে না বললে পার্ল ধরে নেবে না যে আপনার উত্স কোডটি ইউটিএফ -8। এর অর্থ হ'ল প্রতিবার যখন আপনি কিছু বলবেন my $var = 'ほげ', আপনি আপনার প্রোগ্রামটিতে আবর্জনা ইনজেকশন দিচ্ছেন যা পুরোপুরি ভয়াবহভাবে ভেঙে দেবে। আপনাকে "utf8" ব্যবহার করতে হবে না, তবে আপনি যদি তা না করেন তবে আপনার প্রোগ্রামে আপনাকে অবশ্যই কোনও ASCII অক্ষর ব্যবহার করা উচিত নয়।

তৃতীয় সমস্যাটি পার্ল কীভাবে অতীতকে পরিচালনা করে। অনেক দিন আগে, ইউনিকোডের মতো কোনও জিনিস ছিল না এবং পার্ল ধরে নিয়েছিল যে সবকিছু ল্যাটিন -১ পাঠ্য বা বাইনারি ছিল। সুতরাং যখন ডেটা আপনার প্রোগ্রামে আসে এবং আপনি এটিকে পাঠ্য হিসাবে বিবেচনা করতে শুরু করেন, পার্ল প্রতিটি অক্টেটকে ল্যাটিন -1 চরিত্র হিসাবে বিবেচনা করে। এ কারণেই, যখন আমরা "文字 化 け" দৈর্ঘ্যের জন্য জিজ্ঞাসা করি, তখন আমরা 12 পেয়েছি। পার্ল ধরে নিয়েছে যে আমরা লাতিন -1 স্ট্রিং "æååã" (যা 12 টি অক্ষর, যার মধ্যে কিছুগুলি প্রিন্টিং রয়েছে) এ কাজ করছি।

এটিকে "অন্তর্নিহিত আপগ্রেড" বলা হয় এবং এটি করা একেবারে যুক্তিসঙ্গত জিনিস, তবে আপনার পাঠ্য ল্যাটিন -১ না হলে আপনি যা চান তা তা নয়। এজন্য সুস্পষ্টভাবে ইনপুট ডিকোড করা সমালোচনা: আপনি যদি এটি না করেন তবে পার্ল তা করবে এবং এটি এটি ভুল করতে পারে।

লোকেরা সমস্যায় পড়ে যেখানে তাদের অর্ধেক ডেটা সঠিক চরিত্রের স্ট্রিং এবং কিছু এখনও বাইনারি। পার্ল এখনও বাইনারি অংশটি ব্যাখ্যা করবে যদিও এটি ল্যাটিন -১ পাঠ্য এবং তারপরে এটি সঠিক চরিত্রের ডেটা সহ একত্রিত করবে। এটি আপনার চরিত্রগুলি সঠিকভাবে পরিচালনা করার মতো দেখায় যা আপনার প্রোগ্রামটি ভেঙে ফেলেছে, কিন্তু বাস্তবে আপনি এটি যথেষ্ট করেননি।

এখানে একটি উদাহরণ রয়েছে: আপনার একটি প্রোগ্রাম রয়েছে যা একটি ইউটিএফ-8-এনকোডযুক্ত পাঠ্য ফাইলটি পড়ে, আপনি PILE OF POOপ্রতিটি লাইনে একটি ইউনিকোড টেক করেন এবং আপনি এটি মুদ্রণ করেন। আপনি এটি লিখুন:

while(<>){
    chomp;
    say "$_ 💩";
}

এবং তারপরে কিছু ইউটিএফ -8 এনকোডড ডেটা চালান, যেমন:

perl poo.pl input-data.txt

এটি প্রতিটি লাইনের শেষে একটি পু দিয়ে ইউটিএফ -8 ডেটা মুদ্রণ করে। পারফেক্ট, আমার প্রোগ্রাম কাজ করে!

তবে না, আপনি কেবল বাইনারি সংক্ষেপণ করছেন। আপনি ফাইলটি থেকে অক্টেটগুলি পড়ছেন, চম্প \nসহ একটি অপসারণ করছেন এবং তারপরে PILE OF POOঅক্ষরের UTF-8 উপস্থাপনায় বাইটগুলি সন্ধান করছেন । আপনি যখন ফাইল থেকে ডেটা ডিকোড করতে এবং আউটপুটটিকে এনকোড করার জন্য আপনার প্রোগ্রামটি সংশোধন করেন, আপনি লক্ষ্য করবেন যে আপনি পুর পরিবর্তে আবর্জনা ("ð ©") পেয়েছেন। এটি আপনাকে বিশ্বাস করতে পরিচালিত করবে যে ইনপুট ফাইলের ডিকোডিং করা ভুল কাজ। এটা না।

সমস্যাটি হ'ল পুটিকে সুস্পষ্টভাবে ল্যাটিন -১ হিসাবে আপগ্রেড করা হচ্ছে। আপনি যদি use utf8বাইনারি পরিবর্তে আক্ষরিক পাঠ্য তৈরি করতে চান, তবে এটি আবার কাজ করবে!

(ইউনিকোডের সাহায্যে লোকদের সাহায্য করার সময় আমি এটাই প্রথম সমস্যাটি দেখতে পেয়েছি They তারা সঠিক অংশটি নিয়েছিল এবং এটি তাদের প্রোগ্রামটি ভেঙে দিয়েছে und এটি অপরিজ্ঞাত ফলাফলের জন্য দুঃখজনক: আপনি দীর্ঘদিন ধরে একটি কার্যকরী প্রোগ্রাম রাখতে পারেন, তবে আপনি যখন এটি মেরামত শুরু করেন, চিন্তাভাবনা করবেন না; আপনি যদি আপনার প্রোগ্রামে এনকোড / ডিকোড স্টেটমেন্ট যুক্ত করে থাকেন এবং এটি ভেঙে যায়, এর অর্থ কেবল আপনার আরও কাজ করা উচিত Next আরো সহজ!)

পার্ল এবং ইউনিকোড সম্পর্কে আপনার যা জানা দরকার তা সত্যিই এটি। যদি আপনি পার্লকে আপনার ডেটাটি বলে থাকেন তবে এর কাছে জনপ্রিয় সমস্ত প্রোগ্রামিং ভাষার মধ্যে ইউনিকোডের সেরা সমর্থন রয়েছে। আপনি যদি ধরে নেন যে এটি যাদুকরীভাবে জানা যাবে যে আপনি এটি কোন ধরণের পাঠ্য খাওয়াচ্ছেন, তবে, আপনি নিজের ডেটা অলঙ্ঘনীয়ভাবে ট্র্যাশ করতে চলেছেন। কেবলমাত্র আপনার প্রোগ্রামটি আজ আপনার ইউটিএফ -8 টার্মিনালে কাজ করে এর অর্থ এই নয় যে এটি আগামীকাল কোনও ইউটিএফ -16 এনকোডযুক্ত ফাইলটিতে কাজ করবে। সুতরাং এখনই এটি নিরাপদ করুন এবং আপনার ব্যবহারকারীর ডেটা ট্র্যাশ করার মাথাব্যথা নিজেকে বাঁচান!

ইউনিকোড পরিচালনা করার সহজ অংশটি এনকোডিং আউটপুট এবং ডিকোডিং ইনপুট। শক্ত অংশটি আপনার সমস্ত ইনপুট এবং আউটপুট সন্ধান করছে এবং এটি কোন এনকোডিং তা নির্ধারণ করছে। তবে সে কারণেই আপনি বড় টাকা পেয়েছেন :)


নীতিটি ভালভাবে ব্যাখ্যা করা হয়েছে, তবে I / O এর জন্য ব্যবহারিক পদ্ধতির অনুপস্থিত। স্পষ্টভাবে Encodeমডিউলটি ব্যবহার করা ক্লান্তিকর এবং ত্রুটি-প্রবণ এবং এটি আই / ও সম্পর্কিত কোডটি পড়া সত্যিই বেদনাদায়ক করে তোলে। I / O স্তরগুলি সমাধান সরবরাহ করে কারণ তারা প্রয়োজনে স্বচ্ছভাবে এনকোড এবং ডিকোড করে। openএবং binmodeতাদের স্পেসিফিকেশনের জন্য অনুমতি দিন, এবং প্রগমা openডিফল্ট সেট করে, যেমন ট্র্যাচ্রিস্ট তার উত্তরে পরামর্শ দেয়।
প্লেক

48

আমরা সকলেই একমত হয়েছি যে এটি অনেক কারণেই একটি কঠিন সমস্যা, তবে প্রত্যেকের পক্ষে এটি আরও সহজ করার চেষ্টা করার কারণ অবিকল এটি।

সিপিএএন, utf8 :: সবগুলিতে একটি সাম্প্রতিক মডিউল রয়েছে যা "ইউনিকোড চালু করার চেষ্টা করে it সবগুলি"।

যেমনটি উল্লেখ করা হয়েছে, আপনি পুরো সিস্টেমটিকে (বাইরের প্রোগ্রামগুলি, বাহ্যিক ওয়েব অনুরোধগুলি, ইত্যাদি) জাদুকরীভাবে ইউনিকোডও ব্যবহার করতে পারবেন না, তবে আমরা সাধারণ সমস্যাগুলি সহজ করে তোলে এমন সংবেদনশীল সরঞ্জামগুলি তৈরি করতে একসাথে কাজ করতে পারি। এ কারণেই আমরা প্রোগ্রামাররা।

যদি utf8 :: আপনার মনে করা উচিত এমন কিছু কিছু না করে, আসুন এটি আরও উন্নত করার জন্য এটি উন্নত করুন। অথবা আসুন এমন অতিরিক্ত সরঞ্জামগুলি তৈরি করুন যা একসাথে মানুষের বিভিন্ন প্রয়োজনের পাশাপাশি যথাসম্ভব উপযুক্ত করতে পারে।

`


5
আমি উদ্ধৃত মডিউলটির উন্নতির জন্য প্রচুর জায়গা দেখতে পাচ্ছি utf8::allunicode_stringsবৈশিষ্ট্যটির আগে এটি লেখা হয়েছিল , যা Fɪɴᴀʟʟʏ ᴀᴛ ᴏɴɢ Lᴏɴɢ Lᴀsᴛ রেগেক্সকে /uতাদের উপর চাপিয়ে দেয়। আমি নিশ্চিত নই যে এটি এনকোডিংয়ের ত্রুটিগুলির ক্ষেত্রে একটি ব্যতিক্রম উত্থাপন করে, এবং এটিই আপনার কাছে সত্যই হওয়া উচিত। এটি use charnames ":full"প্রগমাতে লোড হয় না , যা এখনও লোড হয়নি। এটা সতর্ক না [a-z]এবং এই ধরনের, printfস্ট্রিং প্রস্থ ব্যবহার \nপরিবর্তে \Rএবং .পরিবর্তে \X, কিন্তু হয়তো those're আরো একটি Perl::Criticব্যাপার। যদি আমি থাকতাম তবে আমি and ইন এবং আউট।
tchrist

13
@tchrist ইস্যু ট্র্যাকার utf8 এর জন্য :: সব এখানে। github.com/doherty/utf8- all/issues তারা আপনার পরামর্শগুলি শুনতে পছন্দ করবে।
শোওয়ার্ন

4
@ শ্যাওয়ার্ন: হ্যাঁ, তবে আমি এখানে যে জিনিস লিখেছি সেগুলি থেকে চালক এবং চিমটি মুক্ত মনে করুন। সত্যি কথা বলতে, আমি এখনও বোধ করছি / কী করা উচিত বনাম কী করা উচিত, এবং কোথায় শিখছি। এখানে বাছাই খালাস বন্ধ একটা চমৎকার উদাহরণ আছে: unichars -gs '/(?=\P{Ll})\p{Lower}|(?=\P{Lu})\p{Upper}/x' | ucsort --upper | cat -n | less -r। একইভাবে, সামান্য প্রাক প্রসেসিংয়ের মতো পদক্ষেপগুলিও ... | ucsort --upper --preprocess='s/(\d+)/sprintf "%#012d", $1/ge'খুব সুন্দর হতে পারে এবং আমি তাদের জন্য অন্যের সিদ্ধান্ত নিতে চাই না। আমি এখনও আমার ইউনিকোড সরঞ্জামবক্স তৈরি করছি
tchrist

35

আমি মনে করি আপনি ইউনিকোড এবং পার্লের সাথে এর সম্পর্ককে ভুল বুঝেছেন। আপনি কোন উপায়ে ডেটা, ইউনিকোড, আইএসও -8859-1 , বা অন্য অনেকগুলি জিনিস সংরক্ষণ করেন তা বিবেচনাধীন , আপনার প্রোগ্রামটি এটি কীভাবে ইনপুট (ডিকোডিং) হিসাবে প্রাপ্ত বাইটগুলি ব্যাখ্যা করতে হবে এবং যে তথ্যটি আউটপুট চায় তা উপস্থাপন করতে (এনকোডিং করা) )। সেই ব্যাখ্যাটি ভুল করুন এবং আপনি ডেটা গার্বেল করুন। আপনার প্রোগ্রামের ভিতরে কোনও ম্যাজিক ডিফল্ট সেটআপ নেই যা আপনার প্রোগ্রামের বাইরের স্টাফগুলিকে কীভাবে আচরণ করবেন তা জানাতে চলেছে।

আপনি মনে করেন এটি কঠিন, সম্ভবত, কারণ আপনি ASCII হওয়ার জন্য সমস্ত কিছুতে অভ্যস্ত। আপনার যা ভাবনা করা উচিত ছিল সেগুলি প্রোগ্রামিং ভাষা এবং এর সাথে ইন্টারঅ্যাক্ট করার মতো সমস্ত বিষয় দ্বারা উপেক্ষা করা হয়েছিল। যদি সবকিছু ইউটিএফ -8 ব্যতীত অন্য কিছু ব্যবহার না করে এবং আপনার কোনও পছন্দ না থাকে তবে ইউটিএফ -8 ঠিক তত সহজ। তবে সবকিছুই ইউটিএফ -8 ব্যবহার করে না। উদাহরণস্বরূপ, আপনি চাইছেন না যে আপনার ইনপুট হ্যান্ডেলটি এমনটি মনে না করে যে এটি UTF-8 অক্টেটগুলি আসলে তা না হওয়া পর্যন্ত, এবং আপনি চান না যে যদি আপনার আউটপুট হ্যান্ডলগুলি UTF-8 হয় তবে যদি সেগুলি থেকে পড়া জিনিসটি UTF-8 পরিচালনা করতে পারে । পার্লের সেই জিনিসগুলি জানার কোনও উপায় নেই। এজন্য আপনি প্রোগ্রামার।

আমি মনে করি না পার্ল 5-এ ইউনিকোড খুব জটিল। আমি মনে করি এটি ভয়ঙ্কর এবং লোকেদের এড়ানো। একটি পার্থক্য আছে। এই লক্ষ্যে, আমি লার্নিং পার্ল, 6th ষ্ঠ সংস্করণে ইউনিকোড রেখেছি এবং কার্যকর পার্ল প্রোগ্রামিংয়ে ইউনিকোডের প্রচুর স্টাফ রয়েছে । ইউনিকোড এবং এটি কীভাবে কাজ করে তা শিখতে এবং বুঝতে আপনাকে সময় দিতে হবে। আপনি অন্যথায় এটি কার্যকরভাবে ব্যবহার করতে সক্ষম হবেন না।


3
আমার মনে হয় আপনার একটা বক্তব্য আছে: এটি ভীতিকর। এটা করা উচিত? আমার জন্য ইউনিকোড আশীর্বাদ, পার্ল 5 এ এটি ব্যবহার করা নয় (আমি কোনও কিছুই ASCII বলে ধরে নিই না, আমার মাতৃভাষাকে কমপক্ষে iso8859-4 দরকার)। আমি রাকুডো এবং ইউটিএফ -8 দিয়ে চেষ্টা করেছি এমন সমস্ত কিছু (এই সীমাবদ্ধ স্যান্ডবক্সে) বাক্সের বাইরে কাজ করে। আমি কি কিছু রেখে গেলাম? আমি এটি আবার জোর দিয়েছি: ইউনিকোড সমর্থনটি জরিমানা করা ভাল, তবে বেশিরভাগ সময় এর প্রয়োজন হয় না। বিষয়ে ভয় দূরে সরাতে, একটি উপায় হ'ল প্রত্যেকে ইন্টার্নালগুলি বোঝার জন্য অনেক কিছু পড়েন। অন্যান্য: আমাদের বিশেষ প্রগমা রয়েছে, তাই use utf8_everywhereমানুষকে আনন্দিত করে। কেন শেষ হবে না?
wk

3
আমি এখনও মনে করি আপনি পয়েন্টটি মিস করছেন। কি কাজ? আপনার ইন্টার্নালগুলি বোঝার দরকার নেই। আপনাকে বাহ্যিক এবং আপনার কীভাবে স্ট্রিংগুলি পরিচালনা করতে চান তা বুঝতে হবে যা বিভিন্ন এনকোডিং এবং একই অক্ষরের বিভিন্ন উপস্থাপনা রয়েছে। টমের পরামর্শ আবার পড়ুন। তিনি যা বলেন তার বেশিরভাগ ক্ষেত্রে আমি বাজি ধরে রাখি যে আপনি রাকুডো আপনার পক্ষে পরিচালনা করেন না।
ব্রায়ান ডি ফোয়

1
@ ডব্লিউ কে: র্যান্ডির উত্তরটি আবার পড়ুন। সীমাবদ্ধতা কী তা সে আপনাকে ইতিমধ্যে জানিয়েছে।
ব্রায়ান ডি বন্ধু

2
@ ব্রায়ান ডি ফয়েঃ: আমি মনে করি যে এই সীমাবদ্ধতাগুলি ঠিক আছে, যেমন ট্রিশিস্ট বলেছেন, প্রতিটি দিকের জন্য কোনও ম্যাজিক বুলেট নেই (আমি স্বীকার করি: আমি এখানে এই প্রশ্ন জিজ্ঞাসার আগে তাদের বেশিরভাগকেই দেখিনি)। সুতরাং, যখন আমরা utf8 এর মতো কিছু দিয়ে প্রচুর বেসিক স্টাফগুলি coverেকে রাখি: সর্বোপরি, কেবলমাত্র ইউটিএফ 8 কাজ করার জন্য বেসিকগুলি পাওয়ার জন্য প্রত্যেককে তার নিজের বিশাল বয়লারপ্লেট তৈরি করার দরকার নেই। "কোনও ভয় নেই" এর অর্থ: বেসিকগুলি আচ্ছাদিত রয়েছে তা জেনে সবাই তার প্রকল্পগুলি শুরু করতে পারেন। হ্যাঁ, আপনি ঠিক বলেছেন, এখনও প্রচুর সমস্যা রয়েছে। তবে যখন শুরু করা সহজ হয়, আমরা সেগুলি সমাধানে আরও বেশি লোক জড়িত থাকব। আইএমএইচও
ডাব্লু

1
@wk - "utf8: all" বা "uni :: perl এর সাথে একমাত্র" ভুল "- তারা CORE তে নেই - সুতরাং প্রত্যেককে অবশ্যই এটি সিপিএএন থেকে ইনস্টল করতে হবে। এবং আপনি যদি মনে করেন এটি কোনও বড় নয় ডিল - দয়া করে পুনর্বিবেচনা করুন - হ্যাঁ, সাহায্যকারী মডিউলটি দিয়ে ইউটিএফ 8 ব্যবহার করা সহজ। এটি ছাড়া
সিওআর পার্লটিতে

28

এই থ্রেডটি পড়ার সময়, আমি প্রায়শই এই ধারণাটি পাই যে লোকেরা " ইউনিকোড " এর প্রতিশব্দ হিসাবে " ইউটিএফ -8 " ব্যবহার করছে । ইউনিকোডের "কোড-পয়েন্টস" এর মধ্যে একটি পার্থক্য তৈরি করুন যা এএসসিআইআই কোড এবং ইউনিকোডের বিভিন্ন "এনকোডিংস" এর বর্ধিত আত্মীয়। এবং তাদের মধ্যে কয়েকটি রয়েছে যার মধ্যে ইউটিএফ -8, ইউটিএফ -16 এবং ইউটিএফ -32 বর্তমান বর্তমান এবং আরও কয়েকটি অপ্রচলিত।

দয়া করে, ইউটিএফ -8 (পাশাপাশি অন্যান্য সমস্ত এনকোডিংগুলি ) বিদ্যমান রয়েছে এবং কেবল ইনপুট বা আউটপুটে এর অর্থ রয়েছে। অভ্যন্তরীণভাবে, পার্ল ৫.৮.১ থেকে সমস্ত স্ট্রিংগুলি ইউনিকোড "কোড-পয়েন্ট" হিসাবে রাখা হয়েছে। সত্য, আপনি পূর্বে প্রশংসনীয়ভাবে কভার হিসাবে কিছু বৈশিষ্ট্য সক্ষম করতে হবে।


19
আমি সম্মত লোকেরা প্রায়শই ইউটিএফ -8⧸16⧸32 এর সাথে ইউ কে বিভ্রান্ত করে, তবে এটি মৌলিকভাবে এবং সমালোচনামূলকভাবে সত্য নয় যে ইউ ᴀ এসের সাথে কিছু বর্ধিত চরিত্র সেট ᴄɪɪ সর্বাধিক, এটি নিছক 10646 ডলার ছাড়া আর কিছুই নয়Uɴɪᴄᴏᴅᴇ তে আরও অনেক কিছু অন্তর্ভুক্ত রয়েছে : কোলেশন, কেসফোল্ডিং, নরমালাইজেশন ফর্ম, গ্রাফিম ক্লাস্টারস, ওয়ার্ড- এবং লাইন ব্রেকিং, স্ক্রিপ্টস, সংখ্যাসূচক সমষ্টি, প্রস্থ, দ্বিদ্বিধায়িকা, গ্লাইফ বৈকল্পিক, প্রাসঙ্গিক আচরণ, লোকেলস, ​​রেজেক্সেস, সমন্বিত শ্রেণি, 100 এর বৈশিষ্ট্য এবং আরও অনেক কিছু
tchrist

15
@ ক্রিশ্চট: প্রথম পদক্ষেপটি হ'ল আপনার প্রোগ্রামে এবং বাইরের বিশ্বে এটির আবর্জনা ছাড়াই ডেটা নেওয়া। তারপরে আপনি কোলেশন, কেস ফোল্ডিং, গ্লাইফ রূপগুলি ইত্যাদি শিশুর পদক্ষেপগুলি সম্পর্কে চিন্তা করতে পারেন।
jrockway

7
আমি সম্মত, ইনপুট বা আউটপুট ট্র্যাশ না করে পার্ল পাওয়া প্রথম অগ্রাধিকার হতে হবে। আমি যা চাইব তা হল একটি মডিউল বা প্রগমা যা নিম্নলিখিত কল্পিত কথোপকথনের প্রতিমা দিতে পারে: "- প্রিয় পার্ল this এই প্রোগ্রামটির জন্য সমস্ত ইনপুট এবং আউটপুট একচেটিয়াভাবে ইউটিএফ -8 হবে you আপনি কি দয়া করে আমার ডেটা ট্র্যাশ করতে পারবেন না? - সুতরাং আপনি কেবল ইউএফটি -8 বলছেন you আপনি কি নিশ্চিত? - হ্যাঁ - সত্যই সত্য? - অবশ্যই - এবং আপনি স্বীকার করেছেন যে আমি যদি ইউটিএফ -8 ডেটা সরবরাহ না করি তবে আমি অদ্ভুত আচরণ করতে পারি? - হ্যাঁ, ঠিক আছে। - ঠিক আছে তো। "
hlovdal

10

প্রাচীন কোডের সত্যিকারের একটি ভয়াবহ পরিমাণ রয়েছে বন্যের মধ্যে, এর বেশিরভাগই সাধারণ সিপিএএন মডিউলগুলির আকারে। আমি খুঁজে পেয়েছি যে আমি যদি ইউনিকোড দ্বারা প্রভাবিত হতে পারে এমন বাহ্যিক মডিউলগুলি ব্যবহার করি তবে আমি নিয়মিত ব্যবহার করি এমন বেশ কয়েকটি পার্ল স্ক্রিপ্টগুলিতে ইউনিকোড-সংক্রান্ত কিছু ব্যর্থতা চিহ্নিত করতে এবং ঠিক করার চেষ্টা করছি (বিশেষত, আইটিভিও ব্যর্থ হয়) ট্রান্সকোডিংয়ের কারণে 7-বিট ASCII নয় এমন কোনও কিছুতে খারাপভাবে)।


আমি -Cইউনিকোড-বুদ্ধিমানের মতো পার্ল একই পৃষ্ঠায় রয়েছে কিনা তা নিশ্চিত করার অপশনটি ব্যবহার করার অর্থ হ'ল, কারণ আমি পরিষ্কারভাবে $LANGএবং $LC_ALLসঠিকভাবে স্থিত করে নিলেও ইউনিকোডের পরিবর্তে আইএসও 8859/1 ব্যবহার করার সিদ্ধান্ত নিতে থাকি । (এটি প্রকৃতপক্ষে প্ল্যাটফর্ম লোকালে লাইব্রেরিতে বাগগুলি প্রতিফলিত করতে পারে)) এটি যাই হোক না কেন, এটি অত্যন্ত বিরক্তিকর হয়েছে যে আমি সেগুলিতে উচ্চারণ সহ প্রোগ্রামগুলিতে আইটিভো ব্যবহার করতে পারি না কারণ পার্ল স্ক্রিপ্টগুলি যে রূপান্তর ত্রুটির সাথে কাজ করে।
গাইকোসর 17

3
-Cবিকল্প ছাড়া একাকী বগি এবং ত্রুটি-প্রবণ । তুমি সংসার ভাঙ্গো। PERL5OPTTheভ্যুতিকে সেট করুন -Cএবং আপনি কী বোঝাতে চাইবেন তা আপনি দেখতে পাবেন। আমরা v5.8 এ আবার চেষ্টা করেছি এবং এটি একটি বিপর্যয় ছিল। আপনি কেবল এমন প্রোগ্রামগুলি বলতে পারবেন না এবং তা অবশ্যই বলবেন না যা তারা আশা করে না যে এখন তারা ইউনিকোডের সাথে व्यवहार করছে যে তারা তাদের পছন্দ হোক বা না পছন্দ। সুরক্ষা সংক্রান্ত সমস্যাগুলিও রয়েছে। খুব কমপক্ষে, print while <>বাইনারি ডেটা পাস করলে যা কিছু ঘটে তা ভেঙে যায়। সুতরাং খুব সমস্ত ডাটাবেস কোড হবে। এটি একটি ভয়ানক ধারণা।
tchrist

1
আমি উদার কথা বলছিলাম, আসলে, বিশেষত -Cবিকল্প ছাড়া না । সুনির্দিষ্ট আমন্ত্রণটি আমি নিয়ে কাজ করেছিলাম -CSDA। এটি বলেছিল, আমি দীর্ঘকাল 5.8.x দিয়ে আটকে ছিলাম (হ্যালো ম্যাকপোর্টস ...), তাই সম্ভবত এটি এরই অংশ ছিল
গিকোসৌর

1
আমি এসই-তে সেট করা PERL_UNICODE নিয়ে ছুটছি। আপনি এটি ডি তে সেট করতে পারবেন না
tchrist

@ ট্রিস্টিস্ট: কিছু পার্ল ভার্মিন্ট পোস্ট করছে যা কোডগুলি সিএসডিএ এবং PERL_UNICODE = এসডিএ ব্যবহার দেখাচ্ছে । সম্প্রদায় আপনার প্রভাব ব্যবহার করুন। তাকে অবশ্যই থামানো উচিত!
অ্যাশলে

1

আপনার ইউনিকোড স্ট্রিং বৈশিষ্ট্যটি সক্ষম করা উচিত, এবং আপনি ভি 5.14 ব্যবহার করেন তবে এটি ডিফল্ট;

আপনার সত্যিই ইউনিকোড শনাক্তকারীদের ব্যবহার করা উচিত নয় sp পারফ 5 এর মাধ্যমে বিদেশী কোডের জন্য তারা অনিরাপদ, কেবল সিপারেলই সে অধিকার পেয়েছিল। উদাহরণস্বরূপ দেখুন http://perl11.org/blog/unicode-phanfiers.html

আপনার ফাইলহ্যান্ডলস / স্ট্রিমগুলির জন্য utf8 সম্পর্কিত: আপনার নিজের বাহ্যিক ডেটা এনকোডিং করে নিজেই সিদ্ধান্ত নিতে হবে। একটি লাইব্রেরি এটি জানতে পারে না এবং যেহেতু লিবিসিও utf8 সমর্থন করে না, যথাযথ utf8 ডেটা বিরল। আরও wtf8 আছে, উইন্ডোগুলির প্রায়শই utf8 এর ক্ষয় হয়।

বিটিডাব্লু: মুজ আসলেই "মডার্ন পার্ল" নয়, তারা কেবল নামটি হাইজ্যাক করে। মুজ নির্ভুল ল্যারি ওয়াল-স্টাইলের পোস্টমডার্ন পার্ল মিশ্রিত হয়েছে বর্জন স্ট্রোস্ট্রপ-স্টাইলের সমস্ত কিছুতে, যথাযথ পার্ল synt সিনট্যাক্সের সারগ্রাহী বিভাজন সহ, যেমন চলক নামগুলির জন্য স্ট্রিংগুলি ব্যবহার করে, ভয়াবহ ক্ষেত্রগুলির বাক্য গঠন এবং খুব অপরিপক্ক নিষ্পাপ বাস্তবায়ন যা একটি 10x এর চেয়ে ধীর গতিতে হয় যথাযথ বাস্তবায়ন cperl এবং perl6 হ'ল প্রকৃত আধুনিক পার্লস, যেখানে ফর্মটি ফাংশন অনুসরণ করে এবং বাস্তবায়ন হ্রাস এবং অনুকূলিত হয় optim

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