কোনও ইউ + এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স কোড দ্বারা নির্দিষ্ট ইমোটিকনকে কীভাবে রূপান্তর করবেন?


16

ইমোটিকনগুলি ইউ + এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সের এমন একটি বিন্যাস ব্যবহার করে নির্দিষ্ট করা হয়েছে বলে মনে হয়
যেখানে প্রতিটি এক্স হেক্সাডেসিমাল অঙ্ক।

উদাহরণস্বরূপ, ইউ + 1F615 হ'ল "বিভ্রান্ত মুখের" জন্য অফিশিয়াল ইউনিকোড কনসোর্টিয়াম কোড 😕

যেহেতু আমি প্রায়শই বিভ্রান্ত থাকি তাই এই প্রতীকটির সাথে আমার দৃ strong়তা রয়েছে aff

U + এ 1F615 উপস্থাপনা আমাকে বিভ্রান্তিকর কারণ আমি ভেবেছিলাম শুধুমাত্র ইউনিকোড অক্ষর সম্ভব এনকোডিং প্রয়োজনীয় 8, 16, 24 বা 32 বিট, যেহেতু 5 হেক্স সংখ্যা 5X4 = 20 বিট প্রয়োজন।

আমি আবিষ্কার করেছি যে প্রতীকটি ব্যাশে সম্পূর্ণ ভিন্ন হেক্স স্ট্রিং দ্বারা উপস্থাপিত বলে মনে হচ্ছে:

$echo -n 😕 | hexdump
0000000 f0 9f 98 95                                    
0000004

$echo -e "\xf0\x9f\x98\x95"
😕

$PS1=$'\xf0\x9f\x98\x95  >'
😕  >

আমি U + 1F615 কে \ x00 \ x01 \ xF6 \ x15 এর মতো কিছুতে রূপান্তরিত করে প্রত্যাশা করব

আমি এই 2 টি এনকোডিংয়ের মধ্যে সম্পর্ক দেখছি না?

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

  • কিছু ওয়েব পৃষ্ঠায় প্রতীক সন্ধান করা
  • ওয়েব ব্রাউজারের ক্লিপবোর্ডে এটি অনুলিপি করা
  • রিয়েল কোডটি আবিষ্কার করতে এটি হ্যাক্সডাম্পের মাধ্যমে প্রতিধ্বনিত করতে ব্যাশে এটি আটকানো।

32-বিট কোডটি কী তা নির্ধারণ করতে আমি এই 20-বিট কোডটি ব্যবহার করতে পারি?

এই 2 সংখ্যার মধ্যে কি কোনও সম্পর্ক বিদ্যমান?

উত্তর:


20

UTF-8ইউনিকোডের একটি পরিবর্তনশীল দৈর্ঘ্য এনকোডিং । এটি ASCII এর সুপারস্টার হিসাবে ডিজাইন করা হয়েছে। এনকোডিংয়ের বিশদ জন্য উইকিপিডিয়া দেখুন । \x00 \x01 \xF6 \x15হবে UCS-4BEবা UTF-32BEএনকোডিং হবে।

ইউনিকোড কোড পয়েন্ট থেকে ইউটিএফ -8 এনকোডিংয়ে পৌঁছানোর জন্য, লোকেলের চারম্যাপটি ইউটিএফ -8 (এর আউটপুট দেখুন locale charmap) ধরে নেওয়া, এটি ঠিক:

$ printf '\U1F615\n'
😕
$ echo -e '\U1F615'
😕
$ confused_face=$'\U1F615'

পরবর্তীটি পসিক্স স্ট্যান্ডার্ডের পরবর্তী সংস্করণে থাকবে

আফাইক, এই সিনট্যাক্সটি 2000 সালে স্ট্যান্ড- অলোন জিএনইউ printfইউটিলিটি ( printfজিএনইউ শেলের ইউটিলিটির বিপরীতে ) দ্বারা প্রবর্তন করা হয়েছিল , ২০০৩-এর মধ্যে প্রথমে echo/ printf/ $'...'বিল্টিনে আনা হয়েছিল , ২০০৪-এ ksh93, ২০১০ সালে বাশ (যদিও সেখানে সঠিকভাবে কাজ করছে না) 2014 পর্যন্ত ), তবে স্পষ্টতই অন্যান্য ভাষা দ্বারা অনুপ্রাণিত হয়েছিল।zsh

ksh93এটি হিসাবে printf '\x1f615\n'এবং সমর্থন করে printf '\u{1f615}\n'

$'\uXXXX'এবং $'\UXXXXXXXX'দ্বারা সমর্থিত zsh, bash, ksh93, mkshও FreeBSD sh, গনুহ printf, গনুহ echo

কারও কারও কাছে সমস্ত সংখ্যার প্রয়োজন ( \U0001F615বিপরীতে যেমন \U1F615) তবে ভবিষ্যতে সংস্করণগুলিতে পরিবর্তিত হওয়ার সম্ভাবনা থাকলেও পসিক্স কম সংখ্যার অনুমতি দেবে। যাই হোক, আপনি সমস্ত সংখ্যা প্রয়োজন হলে \UXXXXXXXXহিসাবে হেক্সাডেসিমেল সংখ্যা দ্বারা অনুসরণ করা হয় \U0001F615FOX, যেমন \U1F615FOXহতো $'\U001F615F'OX

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

সুতরাং, সর্বোত্তম বহনযোগ্যতার জন্য, কেবল এটি ইউটিএফ -8 লোকেলগুলিতে ব্যবহার করা এবং সমস্ত অঙ্ক ব্যবহার করা এবং এতে ব্যবহার করা ভাল $'...':

printf '%s\n' $'\U0001F615'

মনে রাখবেন যে:

LC_ALL=C.UTF-8; printf '%s\n' $'\U0001F615'

বা:

{
  LC_ALL=C.UTF-8
  printf '%s\n' $'\U0001F615'
}

(সহ সব শাঁস সাথে কাজ করবে না bash) কারণ $'\U0001F615'হয় পার্স আগে LC_ALLনির্ধারিত হয়। (আরও মনে রাখবেন যে কোনও সিস্টেমের একটি লোকেল নামক কোনও নিশ্চয়তা নেই C.UTF-8)

আপনার প্রয়োজন:

LC_ALL=C.UTF-8; eval "confused_face=$'\U0001F615'"

বা:

LC_ALL=C.UTF-8
printf '%s\n' $'\U0001F615'

(কোনও যৌগিক কমান্ড বা ফাংশনের মধ্যে নয়)।


বিপরীতে, ইউটিএফ -8 এনকোডিং থেকে ইউনিকোড কোড-পয়েন্টে পেতে, এই অন্য প্রশ্নটি বা সেটিকে দেখুন

$ unicode 😕 
U+1F615 CONFUSED FACE
UTF-8: f0 9f 98 95  UTF-16BE: d83dde15  Decimal: 😕
😕
Category: So (Symbol, Other)
Bidi: ON (Other Neutrals)

$ perl -CA -le 'printf "%x\n", ord shift' 😕
1f615

2
লক্ষ্য করুন যে যদি \U1F615অন্য কোনও বৈধ হেক্সাডেসিমাল অঙ্ক অনুসরণ করা হয় তবে তা পালানোর ক্রমের অংশ হিসাবে ধরে নেওয়া হবে। এটিকে অনুসরণ করে নির্বিশেষে এটিকে কাজ করতে এটির জন্য পর্যাপ্ত আট অঙ্ক দীর্ঘ হতে পারে পর্যাপ্ত \U0001F615
লিখিত

@ ক্যাস্পার্ড, ধন্যবাদ হ্যাঁ, এটি লক্ষণীয়। আমি উত্তরে এটি অন্তর্ভুক্ত করেছি।
স্টাফেন চেজেলাস

7

ইউটিএফ -32 (বড় এন্ডিয়ান) থেকে ইউটিএফ -8 এ রূপান্তর করার একটি উপায় এখানে রয়েছে

$ confused=$(echo -ne "\x0\x01\xF6\x15" | iconv -f UTF-32BE -t UTF-8)     
$ echo $confused 
😕

আপনি 0x01F615সেখানে আপনার হেক্স মানটি লক্ষ্য করবেন , 32 বিট পূরণের জন্য অতিরিক্ত লিডিং 0 দিয়ে প্যাড করুন।

ইউটিএফ -8- তে উইকিপিডিয়া পৃষ্ঠাটি ইউনিকোড কোডপয়েন্ট থেকে তার ইউটিএফ -8 উপস্থাপনার রূপান্তরটি খুব স্পষ্টভাবে ব্যাখ্যা করেছে। তবে এটি নিজেই শেল স্ক্রিপ্টিংয়ে করার চেষ্টা করা সেরা ধারণা নাও হতে পারে।

ইউটিএফ -32 নির্ধারিত-প্রস্থ, এবং কোডপয়েন্ট এবং ইউটিএফ -32 প্রতিনিধিত্বের মধ্যে চিঠিপত্র ছোট ছোট - মান একই the


6

আপনার মাথায় বা কাগজে এটি করার দুর্দান্ত উপায়:

  1. এটি কতটি বাইট হবে তা নির্ধারণ করুন: ইউ + 0080 এর অধীনে মানগুলি একটি বাইট, অন্যথায় ইউ + 0800 এর অধীনে 2 বাইট হয়, অন্যথায় ইউ + 10000 এর অধীনে 3 বাইট হয়, অন্য 4 বাইট হয়। আপনার ক্ষেত্রে, 4 বাইট।

  2. অকট্যাল রূপান্তর হেক্স: 0373025

  3. শেষে শুরু করে, একটি সময়ে 2 অকট্যাল সংখ্যা সরে অকট্যাল মান একটি ক্রম পেতে: 037 030 025

  4. আপনি বাইটের প্রত্যাশিত সংখ্যা কম অকট্যাল মান থাকে, তাহলে শুরুতে একটি অতিরিক্ত 0 যোগ করুন: 000 037 030 025

  5. সব কিন্তু প্রথম জন্য, যোগ 0200পেতে: 000 0237 0230 0225

  6. প্রথম জন্য, যোগ 0300করে প্রত্যাশিত দৈর্ঘ্য 2, 0340যদি এটা 3, বা 0360যদি এটি 4 এর, পেতে: 360 0237 0230 0225

এখন অকট্যাল বেরিয়ে একটি স্ট্রিং হিসাবে লিখুন: \360\237\230\225। আপনি চাইলে ptionচ্ছিকভাবে হেক্সে ফিরে রূপান্তর করুন।

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