কিছু ইউনিকোড অক্ষর আমার টার্মিনালে মুদ্রণ করবে না কেন?


16

আমি অ্যাডোব সোর্স কোড প্রো ফন্ট ব্যবহার করে সাধারণ টার্মিনাল দিয়ে আর্চ লিনাক্স চালাচ্ছি। আমার লোকেলটি সঠিকভাবে সেট করা আছে LANG=en_US.UTF-8

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

কার্ড স্যুটগুলির জন্য ইউনিকোড অক্ষরগুলি সূক্ষ্মভাবে কাজ করে। উদাহরণস্বরূপ, জারি করা

$ printf "\u2660"

স্ক্রিনে একটি কালো হৃদয় প্রিন্ট করে।

তবে নির্দিষ্ট কার্ড খেলতে আমার সমস্যা হচ্ছে। জারি

$ printf "\u1F0A1"

Ἂ1কোদাল a এর টিকিটের পরিবর্তে প্রতীকটি মুদ্রণ করে 🂡 কি ভুল হচ্ছে?

এই সমস্যাটি বেশ কয়েকটি টার্মিনাল (urxvt, xterm, terite) এবং আমি চেষ্টা করেছি এমন প্রতিটি ফন্ট (DejaVu, Inconsolata) জুড়ে রয়েছে।


সতর্কতা: এটি যদি প্রিন্টফ দ্বারা পরিচালিত হয় তবে এটি একটি মানহীন বর্ধন। সুতরাং এই ধরনের পালানো মোটেই কাজ করবেন না এমন আশা করবেন না। দেখুন: pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html
খুব

উত্তর:


27

help printfথেকে অবকাশ printf(1)পালাবার ক্রম জন্য ব্যাখ্যা, এবং গনুহ printf, এর জন্য দস্তাবেজ বলেছেন:

printfব্যাখ্যা করে দুই অক্ষর syntaxes আইএসও সি 99 চালু: \u16 বিট ইউনিকোড (আইএসও / আইইসি 10646) অক্ষর, চার হেক্সাডেসিমেল সংখ্যা হিসাবে নির্দিষ্ট জন্য কার কাছে উত্তর পাব , এবং \U32-বিট ইউনিকোড অক্ষর, আট হেক্সাডেসিমেল সংখ্যা হিসাবে নির্দিষ্ট জন্য hhhhhhhh । স্থানীয় printfঅনুসারে ইউনিকোড অক্ষর আউটপুট করে LC_CTYPE। U + 0000 (U + 009F, U + D800… U + DFFF, U + 0024 ($), U + 0040 (@), এবং U + 0060 (`) ব্যতীত ইউএনকোড অক্ষর U + 0000F, U + D800… U + DFFF এই সিনট্যাক্স দ্বারা নির্দিষ্ট করা যায় না ।

এএনএসআই সি কোটিংয়ের জন্য বাশ ম্যানুয়ালটিতে অনুরূপ কিছু নির্দিষ্ট করা হয়েছে এবং echo:

\uHHHH
ইউনিকোড (আইএসও / আইইসি 10646) অক্ষর যার মান হেক্সাডেসিমাল মান এইচএইচএইচএইচ (এক থেকে চারটি হেক্স অঙ্ক)

\UHHHHHHHH
ইউনিকোড (আইএসও / আইইসি 10646) অক্ষর যার মান হেক্সাডেসিমাল মান এইচএইচএইচএইচএইচএইচএইচএইচএইচ (এক থেকে আটটি হেক্স অঙ্ক)

সংক্ষেপে: \u5 হেক্স ডিজিটের জন্য নয়। এটি \U:

# printf "\u2660 \u1F0A1 \U1F0A1\n"
 1 🂡

2

মুরুর উত্তর সম্পূর্ণ সঠিক, তবে কেবল একটি বিষয় পরিষ্কার করতে:

আপনি যখন মুদ্রণ করছেন \u1F0A1, তখন এটি ষোল-বিট ইউনিকোড পলায়ন হিসাবে ব্যাখ্যা করা হবে \u1F0A, এর পরে আক্ষরিক চরিত্রটি 1(যেহেতু \uনিম্নলিখিত চারটি অক্ষর গ্রহণ করা হয় , এর চেয়ে কম নয়)। U + 1F0A এরপরে গ্রীক একটি আলফা যার উপরে কয়েকজন ডায়াক্রিটিক্স রয়েছে ( গ্রীক ক্যাপিটাল লেটার আলফা সহ সিসিলি এবং ভারিয়া , সুনির্দিষ্ট হতে হবে)।

আপনি যদি আপনার ইউনিকোড পালানোর ক্ষেত্রে ষোলটিরও বেশি বিট চান তবে আপনার ব্যবহার করতে হবে \U, এটি আট অক্ষরের মূল্যবান হেক্স: \U0001F0A1আপনাকে প্লে কার্ড দেবে।


\U0001F0A1আসলে তুলনায় আরও পোর্টেবল \U1F0A1। এটি জিএনইউ স্ট্যান্ডলোন printfইউটিলিটি যা প্রথমে সেগুলি \uXXXX/ \UXXXXXXXXসিকোয়েন্সগুলি চালু করেছিল এবং এর জন্য 4 ডিজিট \uএবং 8 এর জন্য 8 সংখ্যার প্রয়োজন হয় \U। অন্যান্য printfবাস্তবায়ন যেমন জিএনইউ শেলের অন্তর্নির্মিত, ksh93 এবং zsh আরও বেশি শিথিল। কোনও ক্ষেত্রেই printf '\u/\U'পসিক্স নয়। পসিক্স তবে zsh এর নির্দিষ্ট করতে চলেছে এবং এর জন্য $'\U1F0A1'8 টি সংখ্যার প্রয়োজন হবে না।
স্টাফেন চেজেলাস

@ স্টাফেন চ্যাজেলাস আকর্ষণীয়, আমি সর্বদা অনুভব করেছি যে পসিক্স আট-অঙ্কের সাথে যাবে। আমি ধরে নিয়েছি যে আট সংখ্যার সংস্করণটি এখনও zsh এ বৈধ কিনা আপনি যদি কোডের পরে অতিরিক্ত অক্ষর এবং সংখ্যা ক্যাপচার এড়াতে চান?
ড্রাকনিস

হ্যাঁ, \uxxxxহয় আপ 4 সংখ্যা এবং \Uxxxxxxxxহল আপ 8 সংখ্যায় পর্যবসিত। নোট করুন যে ইউনিকোড এখন কোডপয়েন্ট 0 থেকে 0x10FFFF (ইউটিএফ 16 দ্বারা আনা একটি সীমাবদ্ধতা) মধ্যে সীমাবদ্ধ তাই কোড পয়েন্টগুলিতে কখনই 6 টির বেশি সংখ্যক চিহ্ন থাকে না (এখনও \U123456789কোড পয়েন্ট 0x12345678 এর পরে বর্ণিত হবে 9এবং ব্যর্থ হবে)। এর জন্য পসিক্স স্পেসিফিকেশন $'\u\U'এখনও চূড়ান্ত হয়নি (দেখুন austingroupbugs.net/view.php?id=249 )। পূর্ববর্তী খসড়ায়, তাদের সমস্ত 4/8 ডিজিটের প্রয়োজন ছিল কিন্তু পরে এটি পরিবর্তন হয়েছিল (আমার অনুরোধে)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.