একটি পিএইচপি স্ট্রিং কেবলমাত্র বাইটের ক্রম, এতে কোনও এনকোডিং থাকে না with স্ট্রিংয়ের মানগুলি বিভিন্ন উত্স থেকে আসতে পারে: ক্লায়েন্ট (এইচটিটিপি ওভার), একটি ডাটাবেস, একটি ফাইল বা আপনার উত্স কোডের স্ট্রিং আক্ষরিক থেকে। পিএইচপি এই সমস্ত বাইট সিকোয়েন্স হিসাবে পড়ে এবং এগুলি কোনও এনকোডিংয়ের তথ্য কখনই বের করে না।
যতক্ষণ না আপনার সমস্ত ডেটা উত্স এবং গন্তব্যগুলি একই এনকোডিং ব্যবহার করে, সবচেয়ে খারাপটি ঘটতে পারে তা হল স্ট্রিং পজিশনগুলি ভুল (যদি আপনি মাল্টি-বাইট এনকোডিংগুলি ব্যবহার করেন), যেহেতু পিএইচপি অক্ষর নয়, বাইটগুলি গণনা করবে।
তবে যদি এনকোডিংগুলি মেলে না (উদাহরণস্বরূপ আপনি ইউটিএফ -8 হিসাবে সঞ্চিত উত্স ফাইলে একটি স্ট্রিং আক্ষরিক লিখুন এবং তারপরে এটি ল্যাটিন -১ আশা করে এমন একটি ডেটাবেসে প্রেরণ করুন), পিএইচপি আপনার জন্য কোনও রূপান্তর সম্পাদন করবে না: এটি হবে আনন্দের সাথে কাঁচার উপরে বাইটগুলি অনুলিপি করুন।
স্যানিট সমাধানটি হ'ল:
- পিএইচপি-র অভ্যন্তরীণ এনকোডিংটি ইউটিএফ -8 এ সেট করুন।
- আপনার সমস্ত উত্স ফাইলগুলি ইউটিএফ -8 হিসাবে সংরক্ষণ করুন।
- আপনার আউটপুট এনকোডিং হিসাবে ইউটিএফ -8 ব্যবহার করুন (উপযুক্ত
Content-type
শিরোনাম প্রেরণ করতে ভুলবেন না )।
- ইউটিএফ -8 (
SET NAMES UTF8
মাইএসকিউএল) ব্যবহার করতে ডাটাবেস সংযোগ সেট করুন in
- যদি সম্ভব হয় তবে অন্য সমস্ত কিছু ইউটিএফ -8 হওয়ার জন্য কনফিগার করুন।
- যে কোনও কিছুতে আপনি নিয়ন্ত্রণ করতে পারবেন না (যেমন তৃতীয় পক্ষের ওয়েব পরিষেবাদি), আপনি এনকোডিংটি জানেন কিনা তা নিশ্চিত করে নিন এবং যত তাড়াতাড়ি সম্ভব ইউটিএফ -8 এ রূপান্তর করুন এবং যত তাড়াতাড়ি সম্ভব অন্য এনকোডিংয়ে ফিরে আসুন।
ইউটিএফ -৮ কেন? কারণ এটি সমস্ত ইউনিকোড অক্ষরকে উপস্থাপন করতে পারে এবং এটি বিদ্যমান 7-বিট এবং 8-বিট এনকোডিংগুলিকে ছাড়িয়ে যায় এবং এটি ASCII এর সাথে বাইনারি সুসংগত কারণ, প্রতিটি বৈধ ASCII স্ট্রিংটিও একটি বৈধ ইউটিএফ -8 স্ট্রিং (তবে ভিভি নয়) ।)।
আপনার উদাহরণে, যা ঘটে তা এটি।
প্রথমত, আপনি আপনার উত্স ফাইলটি সংরক্ষণ করুন; আপনার পাঠ্য সম্পাদক সম্ভবত ইউটিএফ -8 ব্যবহার করার জন্য কনফিগার করা হয়েছে, সুতরাং আপনার স্ট্রিং আক্ষরিক শেষ হবে ডিস্কে ইউটিএফ -8 এনকোড করা। পিএইচপি এই ফাইলটি পড়ে, স্ট্রিংটিকে বাইটের একটি সিরিজ হিসাবে ব্যাখ্যা করে; $original
এখন 7 টি অক্ষরের একটি ইউটিএফ -8 এনকোডযুক্ত স্ট্রিং রয়েছে, যা কেবল একটি বাইট সিকোয়েন্স (যদিও এটিতে 7 বাইটের বেশি রয়েছে, কারণ প্রতিটি অক্ষর দুটি বা আরও বেশি বাইট দ্বারা উপস্থাপিত হয়)। আপনি যদি তখন কল করেন echo $original
তবে এনকোডযুক্ত স্ট্রিংটি ক্লায়েন্টকে যেমন রয়েছে তেমন পাঠানো হয়; আপনি যদি ক্লায়েন্টকে ইউটিএফ -8 প্রত্যাশা করতে বলে থাকেন, সবকিছু ঠিক আছে, তবে আপনি না থাকলে পিএইচপি-র পার্থক্য বলার উপায় নেই এবং আপনি ব্রাউজারে আবর্জনা দিয়ে শেষ করবেন। পরীক্ষা হিসাবে, এই চেষ্টা করুন:
$original = "शक्नोम्यत्तुम्";
echo strlen($original);
strlen
এনকোডিং-অজোনস্টিক এবং একটি নির্দিষ্ট-প্রস্থ 8 বিট এনকোডিং অনুমান করে, অর্থাৎ প্রতিটি চরিত্রের জন্য একটি বাইট, সুতরাং এটি বাইটগুলি অক্ষর নয়, গণনা করবে।