কীভাবে পিএইচপি অভ্যন্তরীণভাবে স্ট্রিংগুলি উপস্থাপন করে?


18

UTF8 হওয়া?
UTF16?

পিএইচপি-তে স্ট্রিংগুলি ব্যবহৃত এনকোডিংয়ের উপর নজর রাখে?

উদাহরণস্বরূপ এই স্ক্রিপ্টটি দেখুন। বলুন আমি চালাচ্ছি:

$original = "शक्नोम्यत्तुम्";

আসলে কী হয়?

অবশ্যই আমি মনে করি $originalকেবল 7 টি অক্ষর থাকবে না। এই গ্লাইফগুলি অবশ্যই সেখানে কয়েকটি বাইট দ্বারা প্রতিনিধিত্ব করতে হবে।

তারপরে আমি করি:

$converted = mb_convert_encoding ($original , "UTF-8");

কি হবে $converted? এর $convertedথেকে আলাদা হবে কীভাবে $original?

এটি কি $originalঅন্যরকম এনকোডিংয়ের সাথে ঠিক ঠিক একই বাইট ক্রম হবে ?


1
পিএইচপি এর কোন সংস্করণ? পিএইচপি <6 স্থানীয় ইউটিএফ -8 পরিচালনা করতে পারে না। এই সমস্যাটি সমাধান / সহায়তা করতে প্যাকেজ এবং পদ্ধতি রয়েছে। Utf-8 এবং php এর সাথে গুগল মজা। তারপরে পিএইচপি পরিবর্তে অন্য প্ল্যাটফর্মে স্যুইচ করুন। :)
অ্যান্ড্রু টি ফিনেল

4
পিএইচপি <6? এর মধ্যে প্রকাশিত পিএইচপি-র প্রতিটি সংস্করণ অন্তর্ভুক্ত থাকবে ...
টিডামাররা

1
এছাড়াও, পিএইচপি ইউটিএফ -8 পরিচালনা করতে পারে, এতে কেবল ডেডিকেটেড ডেটা টাইপ নেই, তাই আপনি কী করছেন তা খুঁজে বের করতে হবে।
টিডামার্স

উত্তর:


22

একটি পিএইচপি স্ট্রিং কেবলমাত্র বাইটের ক্রম, এতে কোনও এনকোডিং থাকে না 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 বিট এনকোডিং অনুমান করে, অর্থাৎ প্রতিটি চরিত্রের জন্য একটি বাইট, সুতরাং এটি বাইটগুলি অক্ষর নয়, গণনা করবে।


সুতরাং $ রূপান্তরিত একই স্ট্রিং কিন্তু অন্য এনকোডিং উপস্থাপন করবে। আসল কাঁচা এনকোডিং, যা পিএইচপি স্টোর, তার থেকে আলাদা হবে।
ব্যবহারকারী4951

2
পিএইচপি দোকান, বাইট নয় এমন অক্ষর, এবং এটি সমস্ত এ এনকোডিং কথা কে না জানে (যদিও কিছু লাইব্রেরি ফাংশন কি: আমি আপনার জন্য এটা পুনরাবৃত্তি করতে হবে।
tdammers

1
ওহ, এবং এটি "পিএইচপি", "পিএইচপি" নয়।
tmadmers

2
যদি কাঁচা বাইটগুলি একই হয় তবে $ মূল এবং $ এর পরে রূপান্তরিত between আমি যা জিজ্ঞাসা করছি তা।
user4951

2
ওহ, ঠিক আছে, আপনি যা বলতে চাইছেন তা তাই। হ্যাঁ, কাঁচা বাইটগুলি এনকোডিং রূপান্তর অনুযায়ী পরিবর্তন হয়। পিএইচপি যদিও এনকোডিংটি মনে রাখে না, সুতরাং আপনি যদি একটি স্ট্রিংটি ইউটিএফ -8 থেকে ল্যাটিন -1 এ রূপান্তর করেন এবং ফলাফলটি utf-8 হিসাবে বিবেচনা করেন তবে আপনি অদ্ভুত ফলাফল দেখতে পাবেন।
টিডামার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.