এটি বৈধ পরিবর্তিত ইউটিএফ -8?


9

ইউটিএফ -8 হ'ল ইউনিকোড কোডপয়েন্টগুলিকে ভেরিয়েবল-প্রস্থের বিন্যাসে এনকোড করার তুলনামূলক সহজ উপায় যা ইউনিকোড সম্পর্কে অবগত নয় এমন কোডটি সহজেই বিভ্রান্ত করে না।

ইউটিএফ -8 সংক্ষিপ্ত বিবরণ

  • 1-0x7F ব্যাপ্তিতে অন্তর্ভুক্ত বাইটগুলি সাধারণত বৈধ
  • বিট প্যাটার্নযুক্ত 10XX XXXXবাইটগুলি একটি কোডপয়েন্টের অংশটি এনকোড করার জন্য ছয়টি অন্তত উল্লেখযোগ্য বিট ব্যবহার করা হচ্ছে, ধারাবাহিকতা বাইট হিসাবে বিবেচিত হয়। পূর্ববর্তী বাইট দ্বারা প্রত্যাশিত না হলে এগুলি অবশ্যই উপস্থিত হবে না।
  • প্যাটার্ন সহ বাইটগুলি 110X XXXXপরে একটি ধারাবাহিকতা বাইট আশা করে
  • প্যাটার্ন সহ 1110 XXXXবাইটস পরে দুটি ধারাবাহিকতা বাইট আশা করে
  • প্যাটার্ন সহ 1111 0XXXবাইটস পরে তিনটি ধারাবাহিকতা বাইট আশা করে
  • অন্যান্য সমস্ত বাইটগুলি অবৈধ এবং কোনও ইউটিএফ -8 স্ট্রিমে কোথাও উপস্থিত হওয়া উচিত নয়। 5, 6 এবং 7 বাইট ক্লাস্টারগুলি তাত্ত্বিকভাবে সম্ভব, তবে এই চ্যালেঞ্জের উদ্দেশ্যে অনুমতি দেওয়া হবে না।

ওভারলং এনকোডিং

ইউটিএফ -8 এরও দরকার যে কোনও কোডপয়েন্টকে সর্বনিম্ন সংখ্যা বাইটের সাথে উপস্থাপন করা উচিত। যে কোনও বাইট সিকোয়েন্স যা কম বাইট সহ উপস্থাপন করা যায় তা বৈধ নয়। পরিবর্তিত ইউটিএফ -8 নাল অক্ষরগুলির জন্য এটিতে একটি ব্যতিক্রম যুক্ত করে (ইউ +0000), যা C0 80(হেক্স উপস্থাপনা) হিসাবে উপস্থাপন করা উচিত , এবং এর পরিবর্তে নালী বাইটগুলি প্রবাহের যে কোনও জায়গায় উপস্থিত হতে বারণ করে না। (এটি এটি নাল-টার্মিনেটেড স্ট্রিংগুলির সাথে সামঞ্জস্যপূর্ণ করে তোলে)

চ্যালেঞ্জ

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

উদাহরণ

41 42 43  ==> yes (all bytes are in the 0-0x7F range)
00 01 02  ==> no (there is a null byte in the stream)
80 7F 41  ==> no (there is a continuation byte without a starter byte)
D9 84 10  ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41  ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91  ==> no (too many continuation bytes)
E1 E1 01  ==> no (starter byte where a continuation byte is expected)
E0 80 87  ==> no (overlong encoding)
41 C0 80  ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43  ==> no (invalid byte 'F8')

বিধি

  • স্ট্যান্ডার্ড নিয়ম এবং ফাঁকগুলি প্রযোজ্য
  • স্বাক্ষরবিহীন বাইট পরিসর (0-255) এর সমস্ত মান যতক্ষণ পড়া যায় ততক্ষণ ইনপুট এবং আউটপুট যে কোনও সুবিধাজনক বিন্যাসে থাকতে পারে be
    • আপনাকে নাল-টার্মিনেটেড স্ট্রিংয়ের পরিবর্তে অ্যারে বা ফাইল ব্যবহার করতে হবে। আপনার নাল বাইটগুলি পড়তে সক্ষম হতে হবে।
  • সবচেয়ে কম কোড জয়!
  • নোট করুন যে ইউটিএফ -8 ডিকোড করতে বিল্টিনগুলি ব্যবহার করা এখানে প্রদত্ত প্রয়োজনীয়তার সাথে সামঞ্জস্য করার গ্যারান্টিযুক্ত নয়। আপনার চারপাশে কাজ করার এবং বিশেষ ক্ষেত্রে তৈরি করার প্রয়োজন হতে পারে।

সম্পাদনা: ইউটিএফ -8 ডিকোড করে এমন বিল্টিন ব্যবহার না করার জন্য যুক্ত বোনাস

EDIT2: অপরিবর্তিত বোনাস যেহেতু কেবলমাত্র জাস্ট উত্তরটি যোগ্য এবং এটি নির্ধারণ করা বিশ্রী k


আমি এইটার জন্য অপেক্ষা করছিলাম
অ্যাডাম

আপনি 0xF8-0xFF রেঞ্জের একটি অবৈধ বাইট সহ একটি পরীক্ষা কেস যুক্ত করতে চাইতে পারেন।
আর্নল্ড

2
দেখে মনে হচ্ছে সার্গেটস (0xD800 - 0xDFFF) এবং 0x10FFFF এর বাইরে কোডপয়েন্টগুলি অনুমোদিত, "আধুনিক" ইউটিএফ -8 অনুমানের বিপরীতে। আমি মনে করি এটি অতিরিক্তভাবে পরীক্ষার ক্ষেত্রে আদর্শভাবে স্পষ্ট করা উচিত।
nwellnhof

আরও উদাহরণ সহায়ক হবে
ডাবল উজ্জ্বল

"0-0x7F এর পরিসরে বাইটগুলি সহ সাধারণভাবে বৈধ হয়" এটি কি 1 থেকে 0x7f হওয়ার কথা?
উজ্জ্বল

উত্তর:



1

এপিএল (ডায়ালগ ইউনিকোড) , 41 39 বাইট এসবিসিএস

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

{0::0⋄×⌊/'UTF-8'UCS2UCS⍵}'À\x80'RA

এটি অনলাইন চেষ্টা করুন!

'À\x80'⎕R⎕Aআর eplace C0 80বড়হাতের সঙ্গে গুলি একটি lphabet

{} নিম্নলিখিত বেনামী ফাংশন প্রয়োগ করুন, যেখানে যুক্তিটি রয়েছে :

0:: যদি কোনও ত্রুটি ঘটে:

  0 শূন্য ফিরে

 চেষ্টা করে দেখুন:

  ⎕UCS⍵ স্ট্রিংকে কোড পয়েন্টে রূপান্তর করুন

  'UTF-8'⎕UCS⍣2 ইউটিএফ -8 বাইট হিসাবে ব্যাখ্যা করুন এবং ফলস্বরূপ পাঠ্যকে আবার বাইটে রূপান্তর করুন

  ⌊/ সর্বনিম্ন বাইট (একটি নাল বাইট উপস্থিত থাকলে শূন্য, না থাকলে ধনাত্মক, খালি স্ট্রিং হলে "অনন্ত")

  × চিহ্ন (নাল বাইট উপস্থিত থাকলে শূন্য, একটি না থাকলে একটি)


এই সত্য কি ফিরে আসবে না D9 C0 80 84 C0 80 10?
নীল

@ নীল এটি সত্যিই করে। এটি কি ভুল কারণ C0 80অপ্রাসঙ্গিক বাইটগুলি অপসারণটি এমনভাবে বৈধভাবে সংলগ্ন হতে পারে, যদিও সেগুলি পৃথক হওয়ার সময় অবৈধ? সম্পাদনা করুন: কোনও বাইট ব্যয়ে এটি ঠিক করতে আপডেট হয়েছে।
অ্যাডাম

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

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

হ্যাঁ তারা কোয়াডস। ধন্যবাদ।
উজ্জ্বল


0

মরিচা - 191 বাইট 313 বাইট

মূল নীচে প্রতি মন্তব্য সঠিকভাবে কাজ করে না। নতুন এবং উন্নত সংস্করণ। কোনও গ্রন্থাগার ব্যবহার করা হয় না, কারণ মাইটি রাস্টটির আপনার এবং আপনার গ্রন্থাগারগুলির কোনও প্রয়োজন নেই। এই কোডটি স্টেট মেশিনের সাথে প্যাটার্ন মেলানো ব্যবহার করে। দ্বারা নির্লজ্জভাবে UTF8 হওয়া বৈশিষ্ট বন্ধ চমত্কার , মাধ্যমে এটি খোঁজার পর জন স্কিট দ্বারা রেফারেন্স এবং আলোচনা , আমরা বৈশিষ্ট প্রায় চরিত্র অক্ষরের জন্য মরিচা মিল ধরণ ম্যাচ ব্লক মধ্যে অনুলিপি করতে পারবেন। শেষে, আমরা C0 80 টি বৈধ হিসাবে বিবেচিত হওয়ার জন্য গরুর মাংসের বিশেষ মাতফ 8 প্রয়োজনীয় সংযোজন করি। Ungolfed:

/* http://www.unicode.org/versions/corrigendum1.html
 Code Points        1st Byte    2nd Byte    3rd Byte    4th Byte
U+0000..U+007F      00..7F           
U+0080..U+07FF      C2..DF      80..BF           
U+0800..U+0FFF      E0          A0..BF      80..BF       
U+1000..U+FFFF      E1..EF      80..BF      80..BF       
U+10000..U+3FFFF    F0          90..BF      80..BF      80..BF
U+40000..U+FFFFF    F1..F3      80..BF      80..BF      80..BF
U+100000..U+10FFFF  F4          80..8F      80..BF      80..BF
*/

let m=|v:&Vec<u8>|v.iter().fold(0, |s, b| match (s, b) {
        (0, 0x01..=0x7F) => 0,
        (0, 0xc2..=0xdf) => 1,
        (0, 0xe0) => 2,
        (0, 0xe1..=0xef) => 4,
        (0, 0xf0) => 5,
        (0, 0xf1..=0xf3) => 6,
        (0, 0xf4) => 7,
        (1, 0x80..=0xbf) => 0,
        (2, 0xa0..=0xbf) => 1,
        (4, 0x80..=0xbf) => 1,
        (5, 0x90..=0xbf) => 4,
        (6, 0x80..=0xbf) => 4,
        (7, 0x80..=0x8f) => 4,
        (0, 0xc0) => 8, // beefster mutf8 null
        (8, 0x80) => 0, // beefster mutf8 null
        _ => -1,
    })==0;

মরিচা খেলার মাঠে এটি চেষ্টা করুন


এটি ম্যানুয়ালি করার জন্য প্রপস, তবে আমি মনে করি যে আপনার অত্যধিক চেকটি ভুল।
বিফস্টার

আপনার চ্যালেঞ্জ, প্রিয় স্যার, আমাকে অনুকরণে প্ররোচিত করেছেন, এবং আমি এই চিঠিটি এই মুহুর্তে আপনাকে চ্যালেঞ্জ জানিয়ে এই সমাপ্তিটি শেষ করেছি যাতে আপনার প্রশ্নটি আরও ভোঁতাভাবে প্রকাশ করবে ( bit.ly/2T8tXhO )
ডন উজ্জ্বল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.