গত সপ্তাহের নিবন্ধে, আপনি একটি ছোট প্রক্রিয়া শিখেছেন যা বেশিরভাগ এনকোডিং সমস্যার সমাধান করে। কিন্তু একটি এনকোডিং সমস্যা আছে যা সমাধান করা অনেক কঠিন৷৷
আমি জানি আপনি এটি দেখেছেন। (অথবা হয়তো আপনি এটি দেখেছেন?) এটি যখন একটি কোঁকড়া উদ্ধৃতি ’তে পরিণত হয়, অথবা একটি এম-ড্যাশ — এ পরিণত হয়। এটি আপনাকে ভাববে যে আপনি পাগল হয়ে গেছেন। এটা শুধু কাজ করা উচিত!
আপনি একটি দৈত্যাকার টেবিল তৈরি করতে পারেন, যাতে আপনি খারাপ অক্ষর খুঁজে পেতে পারেন এবং তাদের ভাল দিয়ে প্রতিস্থাপন করতে পারেন:
[{broken: '–', fixed: "—"}
{broken: "—", fixed: "–"}
{broken: "‘", fixed: "‘"}
{broken: "’", fixed: "’"}
{broken: "“", fixed: "“"}
{broken: "â€", fixed: "”"}, ...]
কিন্তু সেই ভাঙা অক্ষরগুলিকে ঠিক করার একটি সহজ, আরও নির্ভরযোগ্য উপায় আছে৷৷
কেন ভালো টাইপোগ্রাফি সবসময় ভেঙে যায়?
গত সপ্তাহে, আপনি শিখেছেন যে এনকোডিং হল অর্থহীন বাইটের গোষ্ঠীগুলিকে প্রদর্শনযোগ্য অক্ষরে পরিণত করার একটি উপায়৷ প্রতিটি অক্ষর একটি একক বাইটে উপস্থাপন করা যায় না, কারণ 256 টির বেশি সম্ভাব্য অক্ষর রয়েছে। তাই কিছু অক্ষর, যেমন কোঁকড়া উদ্ধৃতি ’
, একাধিক বাইট দ্বারা প্রতিনিধিত্ব করা হয়:
irb(main):001:0> "they’re".bytes
=> [116, 104, 101, 121, 226, 128, 153, 114, 101]
যদিও স্ট্রিংটিতে শুধুমাত্র 7টি অক্ষর রয়েছে, সেগুলিকে 9 বাইট দ্বারা উপস্থাপন করা হয়!
যখন আপনি শুধুমাত্র কোঁকড়া উদ্ধৃতির উপর ফোকাস করেন:
irb(main):002:0> "’".bytes
=> [226, 128, 153]
আপনি দেখতে পাবেন এটি 3 বাইট ব্যবহার করে। এবং আমাদের জগাখিচুড়ি স্ট্রিং, তারা, তিনটি অক্ষর আছে যেখানে এটি শুধুমাত্র একটি থাকা উচিত. এটি একটি কাকতালীয় চেয়ে বেশি মনে হচ্ছে, তাই না?
মনে হচ্ছে এই তিনটি বাইট UTF-8 হিসাবে পড়া উচিত, যেখানে তারা একটি কোঁকড়া উদ্ধৃতি উপস্থাপন করবে। পরিবর্তে, প্রতিটি বাইট একটি ভিন্ন চরিত্র হিসেবে প্রদর্শিত হচ্ছে৷৷ সুতরাং, কোন এনকোডিং [226, 128, 153]
প্রতিনিধিত্ব করবে ’
হিসাবে ? আপনি যদি জনপ্রিয় এনকোডিংয়ের কয়েকটি টেবিল দেখেন, আপনি দেখতে পাবেন এটি Windows-1252।
আপনি এটি irb
-এ চেক করতে পারেন :
irb(main):003:0> "they’re".force_encoding("Windows-1252").encode("UTF-8")
=> "they’re"
(আমাদের সেই শেষ .encode("UTF-8")
দরকার কনসোলে স্ট্রিং প্রদর্শন করতে।)
হ্যাঁ! এটাই সমস্যা। কিন্তু এটা আরো খারাপ হয়ে যায়।
ডেটাটি UTF-8 বলে অনুমিত হয়, কিন্তু Windows-1252 হিসাবে ভুল পড়া হচ্ছে৷ তবে আপনি সম্ভবত সেই ডেটাটিকে একটি ডাটাবেস বা একটি ফাইলে UTF-8 হিসাবে সংরক্ষণ করবেন। রুবি সহায়কভাবে এটিকে আপনার জন্য UTF-8 তে রূপান্তর করবে, যাতে আপনি এর সাথে শেষ করবেন:
irb(main):004:0> "they’re".force_encoding("Windows-1252").encode("UTF-8")
=> "they’re"
irb(main):005:0> "they’re".force_encoding("Windows-1252").encode("UTF-8").bytes
=> [116, 104, 101, 121, 195, 162, 226, 130, 172, 226, 132, 162, 114, 101]
আপনার স্ট্রিং খারাপভাবে এনকোড করা হয়েছে দুইবার . এই ভাঙা চরিত্রগুলি এখন মনে হচ্ছে যে তারা সেখানে থাকার কথা। এবং যদি আপনি না জানেন যে এটি কীভাবে হয়েছে, তাহলে এটিকে মুক্ত করা প্রায় অসম্ভব।
আপনি কিভাবে এটা ঠিক করবেন?
কিভাবে আপনি স্বাভাবিক জিনিস ফিরে পেতে? আসুন সমস্যাটি পিছনের দিকে চিন্তা করি:
-
আপনার একটি UTF-8 স্ট্রিং আছে, (তারা আবার)
-
একটি Windows-1252 স্ট্রিং থেকে রূপান্তরিত, (তারা আবার)
-
যার বাইট হওয়া উচিত ছিল UTF-8 হিসাবে পড়ুন (তারা)
এটি ঠিক করতে, আপনাকে কেবল সেই পিছনের ধাপগুলি অনুসরণ করতে হবে৷৷ encode
ব্যবহার করুন UTF-8 স্ট্রিংটিকে আবার Windows-1252 স্ট্রিং-এ রূপান্তর করতে। তারপর, force_encoding
ব্যবহার করুন ভুল এনকোড করা Windows-1252 স্ট্রিংটিকে UTF-8 হিসাবে পড়তে বাধ্য করতে:
irb(main):006:0> "they’re".encode("Windows-1252").force_encoding("UTF-8")
=> "they’re"
স্থির!
একটি ছোট সমস্যা আছে...
দুর্ভাগ্যবশত, আপনি সম্ভবত এই সমস্যাটি খুঁজে পেয়েছেন কারণ ফাইল বা ডাটাবেস রেকর্ডের একটি গুচ্ছ এতে খারাপভাবে এনকোড করা ডেটা ছিল। এবং প্রতিটি ফাইল বা রেকর্ড অগত্যা খারাপভাবে এনকোড করা হয় না - আপনার কাছে ভাল এবং খারাপ ডেটার মিশ্রণ থাকতে পারে। বিশেষ করে যদি সেই ডেটা আপনার সাইট পরিদর্শনকারী লোকদের কাছ থেকে আসে।
যদি তা হয়, আপনি প্রতিটি স্ট্রিং-এ সেই কোডটি অন্ধভাবে চালাতে পারবেন না:
irb(main):007:0> "they’re".encode("Windows-1252").force_encoding("UTF-8")
=> "they’re"
irb(main):008:0> "they’re".encode("Windows-1252").force_encoding("UTF-8")
=> "they\x92re"
আপনি যদি এটি ভাল ডেটাতে চালান তবে আপনি এটিকে খারাপ ডেটাতে পরিণত করবেন। তাহলে আপনি কি করতে পারেন?
আপনি একটি হিউরিস্টিক ব্যবহার করতে পারেন:শুধুমাত্র সেই স্ট্রিংগুলি পরিবর্তন করুন যেগুলির মধ্যে একটি খারাপ অক্ষর আছে, যেমন â
. â
এর মত একটি অক্ষর থাকলে এটি ভাল কাজ করে কখনই একটি বৈধ স্ট্রিং-এ প্রদর্শিত হবে না।
শেষবার যখন আমি এই ধরনের বাগ ঠিক করেছি, যদিও, আমি এটি নিরাপদে খেলতে চেয়েছিলাম। আমি সাহায্য করার জন্য আরেকটি দরকারী টুল ব্যবহার করেছি:আমার চোখ।
যখনই আমি একটি খারাপভাবে এনকোড করা স্ট্রিং পেয়েছি, আমি এটির প্রতিস্থাপন সহ এটি মুদ্রণ করেছি:
Changing title with ID 6 from "They’re over there!" to "They’re over there!"
এইভাবে, আমি পরিবর্তিত ছোট সংখ্যক স্ট্রিংগুলিকে স্পট-চেক করতে পারি এবং নিশ্চিত করতে পারি যে সেগুলি আর ভাঙেনি।
আমার মনে হয় আমার মাথাব্যথা আছে
যেমনটি আমি গত সপ্তাহে বলেছিলাম, একই ডেটার বিভিন্ন ব্যাখ্যা আপনার মাথায় রাখা কঠিন! কিন্তু আপনি যদি বিভ্রান্ত হন, তাহলে একটি irb
অন্বেষণ করুন কনসোল সাহায্য করবে। তাই এটা চেষ্টা করে দেখুন! একটি খুলুন, এবং দেখুন আপনি —
এর মধ্যে পিছনে যেতে পারেন কিনা এবং —
, অথবা “
এবং “
.
এগুলির মতো জটিল ধারণাগুলি অনুশীলন করা হল আত্মবিশ্বাসের দ্রুততম উপায় যখন আপনার প্রয়োজন হয়৷ এবং প্র্যাকটিসিং রেল এর বিনামূল্যের নমুনা অধ্যায়ে , আপনি এটি করার জন্য সেরা কৌশল এবং প্রক্রিয়াগুলি শিখবেন৷
৷