ব্যাশে, আমি কীভাবে একটি ইউনিকোড কোডপয়েন্ট [0-9A-F] মুদ্রণযোগ্য অক্ষরে রূপান্তর করতে পারি?


23

আমার কাছে ইউনিকোড কোডপয়েন্টের একটি তালিকা রয়েছে, তবে এই হেক্স মানগুলিকে তারা যে প্রকৃত চরিত্রের প্রতিনিধিত্ব করে তা রূপান্তর করার কোনও "সহজ" উপায় আমি জানি না ...

আমি শুনেছি zsh আছে echo -e '\u0965', তবে আমি ব্যাশ 4.1 ব্যবহার করি ।

বাশের জন্য zsh পদ্ধতির মতো সহজ কিছু আছে কি?


1
স্ট্যাকওভারফ্লোটিও দেখুন: কীভাবে
হিপ্পিট্রেইলে

উত্তর:


16

আপনি জিএনইউ কোর্টিল থেকে আইকনভের সমন্বয়ে বাশের প্রতিধ্বনি বা / বিন / প্রতিধ্বনি ব্যবহার করতে পারেন:

echo -ne '\x09\x65' | iconv -f utf-16be

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

perl -C -e 'print chr 0x0965'

বেশিরভাগ সময় যখন আমাকে এটি করা দরকার হয়, আমি ভিএম / জিভিম এর মতো সম্পাদক হিসাবে থাকি যা অন্তর্নির্মিত সমর্থন করে। সন্নিবেশ মোডে থাকাকালীন, Ctrl-V টিপুন এবং তারপরে আপনার অনুসরণ করুন, তারপরে চারটি হেক্স অক্ষর লিখুন। আপনি যদি ইউ + এফএফএফএফের বাইরে একটি অক্ষর চান তবে একটি বড় বড় ইউ ব্যবহার করুন এবং 8 টি হেক্স অক্ষর টাইপ করুন। ভিম কীম্যাপগুলি তৈরি করতে কাস্টমকে সহজ সমর্থন করে। এটি বিভিন্ন চিহ্নকে বিভিন্ন চিহ্নকে রূপান্তর করে। উদাহরণস্বরূপ, আমার কাছে একটি keymap আছে যা আমি www নামে বিকাশ করেছি, এটি টিএমকে ™, (সি) থেকে ©, (আর) থেকে ®, এবং আরও কিছুতে রূপান্তর করে। ক্লিঙ্গন যখন প্রয়োজনীয় হয়ে যায় তখন তার জন্য আমার কাছে একটি কীম্যাপও রয়েছে। আমি নিশ্চিত যে ইমাসেরও তেমন কিছু রয়েছে। আপনি যদি কোনও জিটিকে + অ্যাপে থাকেন তবে এতে জিভিম এবং জিনোম টার্মিনাল অন্তর্ভুক্ত থাকে, আপনি একটি ইউনিকোড অক্ষর তৈরি করতে 4 হেক্স অক্ষর অনুসরণ করে কন্ট্রোল-শিফট-ইউ চেষ্টা করতে পারেন। আমি নিশ্চিত কে.ডি.এইচ / কিউটিতে কিছু মিল রয়েছে।

আপডেট: 4.2 বাশ হিসাবে, এটি এখন একটি বিল্ট ফিচার হিসাবে মনে হচ্ছে:

echo $'\u0965'

আপডেট: এছাড়াও, আজকাল একটি পাইথনের উদাহরণ সম্ভবত পার্লের চেয়ে পছন্দ হবে। এটি পাইথন 2 এবং 3 উভয় ক্ষেত্রেই কাজ করে:

python -c 'print(u"\u0965")'

ধন্যবাদ ... সুন্দর এবং বাহুল্যবর্জিত মধ্যে Perl এক, কিন্তু এটা আমার একটু কিভাবে এটি হিসাবে হল UTF-16BE মান চিকিত্সা জানে হিসেবে হতভম্ব হয়েছে .. আমি অনুমান যে কি হবে "chr," মানে ...
Peter.O

@ ফ্রেড এটি একটি ভাল পয়েন্ট। পার্ল উদাহরণ স্থানীয় সংবেদনশীল। -সি সম্পূর্ণ ইউনিকোড প্রসেসিং সক্ষম করে, তবে উদাহরণটি কাজ করে কারণ আমার লোকাল একটি ইউনিকোড উদাহরণ ব্যবহার করে। যদি আমি ল্যাং সি তে সেট করি তবে আমি মুদ্রণের বিস্তৃত চরিত্র সম্পর্কে একটি সতর্কতা পাই, তবে এটি এখনও মুদ্রণ করে। আমি chr 0xa2যদি কোনও ইউটিএফ -8 লোকালে মুদ্রণ করি তবে আমি সেন্ট সাইন পাই but তবে আমি যদি ল্যাং = সি ব্যবহার করি তবে আমি পাই কারণ এটি বাইট 0xa2 প্রিন্ট করে যা ইউটিএফ -8 এ অবৈধ। ভিম / জিভিম উদাহরণ লোকালের সাথে আধা সংবেদনশীল। আরও সঠিকভাবে, ফাইল এনকোডিংয়ে। আপনি যদি ভিএমটি কোনও ইউটিএফ -8 স্থানীয় স্থানে চালু করে থাকেন তবে আপনার প্রয়োজন হবে:set encoding=utf-8
penguin359

@ ফ্রেডের আমার উল্লেখ করা উচিত, পার্ল ইউটিএফ -8 এর মতো ইউনিকোড লোকালে চালু করা হলে পার্ল একটি ইউনিকোড কোডপয়েন্ট হিসাবে ক্রিয়াকলাপের মানটি বিবেচনা করে। কোডপয়েন্ট হ'ল অনন্য সংখ্যা যা কোনও চরিত্রকে উপস্থাপন করে এবং ইউটিএফ -16 বিই বা ইউটিএফ -8 এর মতো কোনও এনকোডিংয়ের সাথে আবদ্ধ নয়। এটি প্রিন্ট করলে এটি সঠিক এনকোডিংয়ে রূপান্তর করে। উদাহরণস্বরূপ, কুনিফর্ম সাইন এ কোডেপয়েন্ট ইউ + 012000। আমি এটি উপস্থাপন করতে chr 0x12000পার্লে (ইউনিকোড সক্রিয় বলে ধরে নিচ্ছি ) ব্যবহার করতে পারি। ইউটিএফ -16 বিইতে এটি 0xd8, 0x08, 0xdc এবং 0x00। আপনার অক্ষরটি ইউ + 0965 যা ইউটিএফ -16 বিইতে 0x65 এর পরে 0x09 বাইট হিসাবে ঘটে to
পেঙ্গুইন 359

@ পেঙ্গুইন 359 .. ধন্যবাদ, একদিন (আশাবাদী) পার্লের দিকে আমার ভালো নজর থাকবে .. মনে হচ্ছে এটি নিখরচায় ক্রিপ্টিক, তবে তারপরে প্রথমে সেড এবং রেজেক্স করেছিল, এবং এখন এটি বেশ সহজ ... সম্ভবত এটি কিছুটা হলেও ভিমের মতো; একটি খাড়া শেখার বক্ররেখা, তারপরে প্লেইন নৌযান .... আপনার ব্যাখ্যাটি পড়া ভাল ... এটি পথ সুগম করে ..
পিটার.ও

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

13

ব্যাশ 4.2 (2011 সালে মুক্তি) জন্য অতিরিক্ত সমর্থন echo -e '\u0965', printf '\u0965', printf %b '\u0965'এবং echo $'\u0965'এছাড়াও হবে।

http://tiswww.case.edu/php/chet/bash/FAQ :

o   $'...', echo, and printf understand \uXXXX and \UXXXXXXXX escape sequences.

ধন্যবাদ ... আমি এখনও উবুন্টু 10.04 এ প্রাথমিকভাবে ব্যাশ 4.1.5 ব্যবহার করছি, তবে এটি এখন 4.2 এ উপলব্ধ তা জেনে রাখা ভাল। (+1)
পিটার.ও

1
+1 টি; নোট করুন যে bash 4.2.xসংস্করণগুলিতে একটি বাগ রয়েছে যেখানে 0x80এবং 0xff( 128 - 255) এর মধ্যে মানগুলি - যেমন বর্ধিত ASCII সীমার মধ্যে - সঠিকভাবে ইউটিএফ 8-এনকোড হয় না এবং এর পরিবর্তে স্রেফ পাস হয়ে যায় যার ফলে কিছু টার্মিনাল রেন্ডার করে একটি অবৈধ ইউটিএফ 8 চর তৈরি হয় ?। (অন্তত) 4.3.11এটি স্থির করা হয়েছে; যদি echo $'\ued'উপস্থাপনা í, তারপর বাগ সংশোধন করা হয় না বর্তমান।
mklement0

5

আপনার যদি জিএনইউ কোর্টিল রয়েছে তবে চেষ্টা করুন printf:

$ printf '\u0965\n'

echo যদি আপনার কনসোলটি ইউটিএফ -8 ব্যবহার করে এবং আপনার কাছে ইউটিএফ -8 এনকোডিং রয়েছে তবে কাজটি করতে পারেন:

$ echo -e '\xE0\xA5\xA5'

আপনি ইউটিএফ -8 হেক্স এনকোডিং থেকে ইউনিকোডের একটি সারণিটি এখানে পেতে পারেন: http://www.utf8-chartable.de/ । আপনি ইউনিকোড কোড পয়েন্টগুলি বেশ কয়েকটি স্ক্রিপ্টিং ভাষা ব্যবহার করে হেক্সে রূপান্তর করতে পারেন। পাইথন ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে:

python -c "print(unichr(int('0965', 16)).encode('utf-8').encode('hex'))"

নীচে একটি পার্ল স্ক্রিপ্ট যা আর্গুমেন্টগুলি সঠিক হেক্স মানকে রূপান্তর করবে (অনেকগুলি অপ্রয়োজনীয় প্রথম বন্ধনী এখানে):

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Encode;

foreach (@ARGV) {
    say unpack('H*', encode('utf8', chr(hex($_))))
}

এই ক্ষেত্রে,

./uni2utf 0965
e0a5a5

অবশ্যই, আপনার যদি পার্ল বা পাইথন থাকে তবে আপনি কেবল অক্ষরগুলি মুদ্রণ করতে ব্যবহার করতে পারেন।


ধন্যবাদ .. echoকোডিপয়েন্টগুলি 2-বাইট ইউটিএফ -16 বিগ-এন্ডিয়ান হিসাবে আমি যা চাই তা করতে পারে না .. তবে আপনি আমাকে স্মরণ করিয়ে দিয়েছেন যে 2 টি প্রিন্টফ ফাংশন রয়েছে! (আমি ভেবেছিলাম প্রিন্টফ এটি করতে পারে, এবং মনে হয় যে আমি ডাব্লুএস ভুলটি প্রেরণা করছি) ... $(which printf)কাজ করে ... অজগর উদাহরণের জন্য ধন্যবাদ .. তবে এর জন্য (আমার শেখার বক্রতা), আমি খুব কাছাকাছি থাকার চেষ্টা করছি একমাত্র স্ক্রিটিং ভাষা জড়িত হিসাবে "বাশ" করা সম্ভব .. (যখন আমি ব্যাশ নিয়ে যথেষ্ট স্বাচ্ছন্দ্য বোধ করি তখন আমি পাইথনে আটকে যাব ... বিটিডব্লু, .encode('hex')আমার যা প্রয়োজন তার চেয়ে একধাপ বেশি ..) সেখানে কিছুটা ব্যস্ত :)
পিটার.ও

হ্যাঁ, .encode ('hex') কেবলমাত্র আমার জন্য প্রতিধ্বনি নিয়ে কাজ করেছিল বলে মনে হয়েছিল এমন হেক্স কোড পাওয়ার জন্য। খুশি যে এর কমপক্ষে একটি অংশ সহায়ক ছিল।
স্টিভেন ডি

আমি এখনই আপনাকে দেখতে পেয়েছি স্নিপেটটি .. ধন্যবাদ ... এই বিভিন্ন সমাধান উপস্থাপন করা ভাল ... প্রিন্টএফ হ'ল আমি যা খুঁজছিলাম ঠিক সেটাই (একক কমান্ড, zsh উদাহরণ অনুসারে) ... .. আমি আমার
অপ্রয়োজনীয়

আমি বিশেষত printfউপরের ব্রেভটি পছন্দ করি , তবে এটি নীচের মানগুলি হ্যান্ডেল করে না `` \ u00A0 ... I've just re-discovered something I already knew (but dropped off the radar)... Here is a Question I asked about 4 months ago; [Why does printf report an error on all but three (ASCII-range) Unicode Codepoints](http://askubuntu.com/questions/20806/why-does-printf-report-an-error-on-all-but-three-ascii-range-unicode-codepoints)... So *penguin359's* পার্ল সমাধানটি এখন বেশ ভাল দেখাচ্ছে :) .. এটি একটি একক ইনভোক্যাটন, এবং আমি "টাইপ করা সহজ" এর পরে, তাই আমি দেব তাঁর জন্য সবুজ-টিকperl
পিটার.ও

2

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

      echo -n 0x0965 |recode UTF-16BE/x4..UTF-8

একটি কাঁচা হেক্সস ডাম্পকে ইনপুট হিসাবে প্রক্রিয়া করার জন্য এখানে একটি পদ্ধতি রয়েছে (উদাহরণস্বরূপ, কোনও পলায়ন-প্রিফিক্স; \ u0965, এবং কোনও \ x09 \ x65) নেই ..
xxdহেক্স-ডাম্প ইউটিলিটি (এর সাথে প্যাকেজড vim-common) যা কাঁচা হেক্স ডাম্পকে ফিরিয়ে আনতে পারে ডাম্পটি যে অক্ষরগুলিকে প্রতিনিধিত্ব করে ... ইউনিকোড কোডপয়েন্টগুলি হ'ল ইউটিএফ -16 বিগেন্ডিয়ান, হ্যাক্স-ডাম্প হ'ল
xxdরিভার্ট মোডে লাইন ব্রেক সহ হেক্স মানগুলির একটি স্রোত গ্রহণ করে wh যা উপেক্ষা করা হয়।

এই স্ক্রিপ্টটি একটি UTF-16BE স্ট্রিম তৈরি করে, যা এটি পরে মূল চরকে ফিরে আসে।
শেষ লাইনে দুটি প্রয়োজনীয় কমান্ড রয়েছে; xxdএবংiconv

for line in \
  "Matsuo Basho (1644-1694)" \
  "  pond" \
  "  frog jumps in" \
  "  plop!"
do 
  echo "$line" |iconv -f "$(locale charmap)" -t "UTF-16BE" |xxd -ps -u 
done |
#    (---this is the **revert** code---) 
tee >(xxd -p -u -r |iconv -f "UTF-16BE") ;echo

এখানে আউটপুট (প্রথমে ইউটিএফ -16 বিই হেক্স-ডাম্প ইনপুট দেখাচ্ছে) is
বিঃদ্রঃ; xxdoutput০ হেক্স-ডিজিটে একটি নতুন লাইনের সাথে নিজস্ব আউটপুটকে বিভাগ করে ... রিভার্ট অপশনটি এই নতুনলাইনগুলিকে উপেক্ষা করে .. এটি কোনও / সমস্ত নিউলাইনকে উপেক্ষা করে (যেহেতু হেক্স-অঙ্কগুলি নয়) ..

004D0061007400730075006F00200042006100730068006F002000280031
003600340034002D00310036003900340029000A
002000200070006F006E0064000A
0020002000660072006F00670020006A0075006D0070007300200069006E
000A
002000200070006C006F00700021000A

Matsuo Basho (1644-1694)
  pond
  frog jumps in
  plop!

যেহেতু মনে হচ্ছে আপনি নিজের উত্তরে পেঙ্গুইন 359 এর তথ্য ব্যবহার করেছেন তাই আপনি তার উত্তরটি আমার চেয়ে সঠিক হিসাবে চিহ্নিত করে বিবেচনা করতে পারেন।
স্টিভেন ডি

@ স্টিভেন ডি: একটি উল্লেখযোগ্য মন্তব্য, তবে "মনে হচ্ছে" এটি অপারেটিভ শব্দ। আমি এখন বেশ কয়েকদিন ধরে এই জাতীয় আইকনভি ব্যবহার করছি, যা আমার মনে মনে ভাবছিল যে এখানে একটি আদেশ আছে কিনা। আমি উইন্ডোজ (সি ++) তে অনুরূপ পুরো ফাইল প্রক্রিয়াজাতকরণ করেছি, তাই ইউনিকোড সম্পর্কে আমার একটি যুক্তিসঙ্গত বোধ আছে। আমি সত্যিই একটি দ্রুত এবং সহজ bashপদ্ধতির পরে ছিলাম । "বাশ" দ্বারা আমার অর্থ: ব্যাশ স্ক্রিপ্টিং ভাষা ব্যবহার করা; বাশের মধ্যে থেকে পাইথন / পার্ল নয়)। আমি এটিকে উত্তর হিসাবে যুক্ত করেছি কারণ এই পৃষ্ঠাটি পড়ার কারও কাছে এটির কিছু মূল্য হতে পারে। এটি একটি সম্পূর্ণ ফাইলের জন্য ভাল এক-লাইনার। আপনার printfজন্য আমার সেরা উত্তর।
পিটার.ও

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

ধন্যবাদ .. আমি সে সম্পর্কে ভাবছিলাম .. সেই ওয়েবপৃষ্ঠাটি হুবহু চূড়ান্ত রেফারেন্স নয় ... সুতরাং এটি একটি বিকল্পের আরও বেশি ...
পিটার.ও

1

আপনার ওএসের জন্য ডিফল্ট এনকোডিংটি ইউটিএফ -8 (বেশিরভাগ বর্তমানের ডিস্ট্রোদের ক্ষেত্রে সত্য) ধরে নেওয়া হয় তবে আপনি কোনও ইউনিকোড কোড পয়েন্ট রূপান্তর করতে সরাসরি ব্যাশ ব্যবহার করতে পারেন:

echo -e "Unicode Character 'DEVANAGARI DOUBLE DANDA' (U+0965) \U0965"

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

printf "%b" "Unicode Character (U+0965) \U0965 \n"
echo $'Unicode Character (U+0965) \U0965'

লক্ষ্য করুন ব্যাশ 4.2 থেকে ইউনিকোড কোড পয়েন্ট 0x80থেকে 0xFFভুল এনকোড করা হয় (ব্যাশ বাগ)। এই সমস্যাটি সমাধান করার জন্য আপনাকে অবশ্যই এই সাইটে প্রোগ্রামটি একবার দেখে নিতে হবে (সংখ্যাগুলিকে চরকে রূপান্তর করার বিষয়ে গভীর গভীর দৃষ্টিভঙ্গির জন্যও ভাল।


4.3 বাশ এবং zsh এ আমার জন্য কাজ করে। ৪.২ ব্যাশ-এর ​​জন্য কোনও বাগ রিপোর্ট রয়েছে যার সাথে আপনি লিঙ্ক করতে পারেন?
মাইকেল

এটি আমার কাছে সঠিক বাগের মতো দেখাচ্ছে: https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.htmlবিবরণ: \ u এবং \ U \ u80 এবং ff uff এর মধ্যে ভুলভাবে মানগুলি এনকোড করেছে

0

ব্যাশ সংস্করণ ৪.২ (এবং উচ্চতর) তে প্যাটার্ন প্রতিস্থাপন ব্যবহার:

${parameter/pattern/string}

যেমনটি এখানে বর্ণিত হয়েছে: // ধীরে ধীরে

UNICODE_HEX="U+02211"
printf ${UNICODE_HEX/U+/"\U"}


UNICODE_HEX="U+03BB"
printf ${UNICODE_HEX/U+/"\U"}
λ         

1
দ্রষ্টব্য, পূর্বের উত্তরে যেমন বলা হয়েছে , এটি কেবল বাশ সংস্করণ 4.2 (এবং আরও উচ্চতর) এ কাজ করে। আসলে, এটি পূর্বের উত্তরে মোটামুটি সামান্য যোগ করে।
জি-ম্যান 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.