পিএইচপি: মূল অক্ষর সেটটি না জেনে কোনও স্ট্রিংকে ইউটিএফ -8 এ রূপান্তর করুন, বা কমপক্ষে চেষ্টা করুন


146

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা সারা বিশ্ব থেকে ক্লায়েন্টদের সাথে ডিল করে, এবং স্বাভাবিকভাবেই, আমি চাই যে আমার ডাটাবেসে যা কিছু আছে সবগুলি ইউটিএফ -8 এনকোড করা হোক।

আমার জন্য প্রধান সমস্যাটি হ'ল আমি জানি না যে কোনও স্ট্রিংয়ের উত্সটি কী হতে যাচ্ছে তা এনকোডিং হচ্ছে - এটি কোনও পাঠ্য বাক্স থেকে হতে পারে ( <form accept-charset="utf-8">ব্যবহারকারীর পক্ষে যদি ফর্মটি জমা দেওয়া হয় তবেই এটি কেবল কার্যকর হবে), বা এটি হতে পারে একটি আপলোড করা পাঠ্য ফাইল থেকে, সুতরাং ইনপুটটির উপরে আমার সত্যিই কোনও নিয়ন্ত্রণ নেই।

আমার যা দরকার তা হ'ল একটি ফাংশন বা শ্রেণি যা নিশ্চিত করে যে আমার ডাটাবেসে থাকা জিনিসগুলি যথাসম্ভব ইউটিএফ -8 এনকোডড রয়েছে। আমি চেষ্টা করেছি iconv(mb_detect_encoding($text), "UTF-8", $text); তবে এতে সমস্যা আছে (যদি ইনপুটটি 'বাগদত্ত' হয় তবে এটি 'বাগদত্ত' ফেরত দেয়)। আমি অনেক কিছু চেষ্টা করেছি = /

ফাইল আপলোডগুলির জন্য, আমি শেষ ব্যবহারকারীকে তারা ব্যবহার করা এনকোডিং নির্দিষ্ট করতে এবং তাদের আউটপুট কেমন হবে তার পূর্বরূপ প্রদর্শন করার ধারণাটি পছন্দ করি, তবে এটি কদর্য হ্যাকারদের বিরুদ্ধে সহায়তা করে না (বাস্তবে, এটি তাদের জীবন তৈরি করতে পারে) কিছুটা সহজ)।

আমি এই বিষয়ে অন্যান্য এসও প্রশ্নগুলি পড়েছি, তবে তাদের সবার মধ্যে "আমার কাছে আরএসএস ফিডগুলি পার্স করা দরকার" বা "ওয়েবসাইটগুলি থেকে ডেটা স্ক্র্যাপ করা দরকার" (অথবা, "আপনি পারবেন না") এর মতো সূক্ষ্ম পার্থক্য রয়েছে বলে মনে হয়।

তবে এমন কিছু অবশ্যই আছে যা অন্তত একটি ভাল চেষ্টা আছে !


5
একেবারে সঠিক হওয়া সংজ্ঞা দ্বারা এটি মূলত সম্ভব নয়, বাস্তবে অজানা এনকোডিং অনুমান করার সাফল্যের হার ভয়ঙ্কর নয়। হিউরিস্টিক্স ব্যবহার করা সম্ভব, তবে এটি 100% এর চেয়ে কম উপাদানের উপর নির্ভর করে সময়ের 100% এর চেয়ে কম সঠিক হবে । আপনার সচেতন হওয়া দরকার। সম্ভবত এখানে কেউ কমপক্ষে ভাল heuristic সঙ্গে একটি লাইব্রেরি প্রস্তাব করতে পারেন।
প্রতারণা

অবশ্যই, আমি জানি যে এর কোনও নিখুঁত সমাধান নেই - সুতরাং এমন কোনও কিছুর জন্য আকাঙ্ক্ষা যা অন্তত ভালভাবে চলবে।
গ্রিম ...

এই শক্তি সহায়তা: stackoverflow.com/q/505562/642173
Melsi

আপনি কি UTF-8//IGNORE2 য় প্যারাম হিসাবে ব্যবহার করার চেষ্টা করেছেন iconv?
আগুন

হ্যাঁ, এটাই আমি শেষ করেছিলাম। নিখুঁত নয়, স্পষ্টতই, ততক্ষণে 'বাগদত্ত' পরিণত হয় 'বাগদত্ত', তবে এটি অবশ্যই আরও ভাল। ট্রান্সলিট কীভাবে কাজ করে না?
...

উত্তর:


255

আপনি যা চাইছেন তা অত্যন্ত শক্ত। যদি সম্ভব হয় তবে ব্যবহারকারীকে এনকোডিং নির্দিষ্ট করা সবচেয়ে ভাল getting আক্রমণ আটকাতে সেভাবে খুব সহজ বা শক্ত হওয়া উচিত নয়।

তবে আপনি এটি করার চেষ্টা করতে পারেন:

iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text);

এটি কঠোরভাবে সেট করা আপনাকে আরও ভাল ফলাফল পেতে সহায়তা করতে পারে।


5
দয়া করে mb_detect_encodingআপনার পিএইচপি ডিস্ট্রোতে উত্স কোডটি একবার দেখুন (এখানে কোথাও: ext / mbstring / libmbfl / mbfl / mbfl_ident.c)। এই ফাংশনটি মোটেই সঠিকভাবে কাজ করে না। কিছু এনকোডিংয়ের জন্য এমনকি এটি "সত্য সত্য" থাকে, হ'ল। অন্যরা Ctrl + c Ctrl + v ফাংশনে থাকে। এর কারণ আপনি কোনও ধরণের অভিধান বা পরিসংখ্যান পদ্ধতির (যেমন আমার মতো) এনকোডিং সনাক্ত করতে পারবেন না।
ওরোবোরাস 102

1
যেভাবে আমি এটি বুঝতে পারি, mb_detect_encodingসরবরাহিত এনকোডিংগুলির তালিকার মধ্য দিয়ে যায় এবং স্ট্রিংয়ে কোনও অবৈধ বাইট অনুক্রম নেই এমন প্রথমটি গ্রহণ করে ... আইএসও -8859-1 এর মতো কোনও অবৈধ বাইট অনুক্রম নেই এমন এনকোডিংগুলির জন্য, এটি সর্বদা সত্য । কোনও "স্মার্ট" হিউরিস্টিকস নয়, এবং আপনার পাস করা এনকোডিংগুলির তালিকা (এবং অর্ডার) দিয়ে ফলাফলগুলি ব্যাপকভাবে পৃথক হয়।
wutz

এটি আমার পক্ষে কাজ করছে বলে মনে হচ্ছে। আমার ব্যবহারকারীরা একটি ইউটিএফ 8 পৃষ্ঠায় টেনিমস দিয়ে পাঠ্য জমা দিচ্ছিল, তবুও কোনও অজানা কারণে কখনও কখনও ইউটিএফ 8 অক্ষর ডাটাবেসে শেষ হয়। এটি ঠিক করে দিয়েছে, তাই আপনাকে অনেক ধন্যবাদ।
giorgio79

@ জেফ ডে - এর জন্য ধন্যবাদ আমার অজ্ঞতা ক্ষমা করুন, 'কঠোরতায় সেট' এর অর্থ কী?
আশ501

[জেফ ডে] mb_detect_order()এই পরমের জন্য এটি পূর্বনির্ধারিত মান হলেও প্রেরণ করছে কারণ তিনি কঠোরভাবে এনকোডিং সনাক্তকরণ সত্য (তৃতীয় পরম) করতে চেয়েছিলেন :)
jave.web

28

মাতৃভূমি রাশিয়ায় আমাদের কাছে 4 টি জনপ্রিয় এনকোডিং রয়েছে, সুতরাং আপনার প্রশ্নটি এখানে খুব চাহিদা রয়েছে।

কেবলমাত্র চিহ্নের কোড কোডগুলি দ্বারা আপনি এনকোডিং সনাক্ত করতে পারবেন না কারণ কোড পৃষ্ঠাগুলি ছেদ করে। বিভিন্ন ভাষায় কিছু কোডপেজ এমনকি পুরো ছেদ রয়েছে। সুতরাং, আমাদের অন্য পদ্ধতির প্রয়োজন

অজানা এনকোডিংগুলির সাথে কাজ করার একমাত্র উপায় সম্ভাব্যতা নিয়ে কাজ করছে। সুতরাং, আমরা "এই পাঠ্যের এনকোডিংটি কী?" এই প্রশ্নের উত্তর দিতে চাই না, আমরা "এই পাঠ্যের সম্ভবত এনকোডিং কী? " তা বোঝার চেষ্টা করছি ।

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

আপনি সমর্থন করতে চান এমন প্রতিটি এনকোডিংয়ে চর কোডগুলির সম্ভাব্যতা সীমা তৈরি করুন। আপনি আপনার ভাষার কয়েকটি বড় পাঠ্য ব্যবহার করে এটি তৈরি করতে পারেন (উদাহরণস্বরূপ কিছু কল্পকাহিনী, ইংরেজির জন্য শেক্সপিয়ার এবং রাশিয়ান, লোলের জন্য টলস্টয় ব্যবহার করুন)। আপনি এইভাবে স্মেথ পাবেন:

    encoding_1:
    190 => 0.095249209893009,
    222 => 0.095249209893009,
    ...
    encoding_2:
    239 => 0.095249209893009,
    207 => 0.095249209893009,
    ...
    encoding_N:
    charcode => probabilty

পরবর্তী. আপনি অজানা এনকোডিংয়ে পাঠ্য গ্রহণ করেন এবং আপনার "সম্ভাব্য অভিধান" -এ প্রতিটি এনকোডিংয়ের জন্য আপনি অজানা-এনকোডযুক্ত পাঠ্যে প্রতিটি চিহ্নের ফ্রিকোয়েন্সি সন্ধান করেন। প্রতীকগুলির যোগফলগুলির যোগফল। আরও বড় রেটিং সহ এনকোডিং সম্ভবত বিজয়ী। বড় লেখার জন্য আরও ভাল ফলাফল।

আপনি যদি আগ্রহী হন তবে আমি আপনাকে এই কাজটিতে সানন্দে সাহায্য করতে পারি। আমরা দ্বি-চারকোড সম্ভাব্য তালিকা তৈরি করে নির্ভুলতাটি বাড়িয়ে দিতে পারি।

BTW। mb_detect_encoding certanly কাজ করে না। হ্যাঁ, একেবারে দয়া করে "ext / mbstring / libmbfl / mbfl / mbfl_ident.c" - তে এমবি_ডেটিট_এনকোডিং উত্স কোডটি একবার দেখুন।


11

আপনি সম্ভবত এটি চেষ্টা করেছেন কিন্তু কেন কেবল এমবি_কভার্ট_ইনকোডিং ফাংশনটি ব্যবহার করবেন না? এটি প্রদত্ত পাঠ্যের চার সেটটি স্বয়ংক্রিয়ভাবে সনাক্ত করার চেষ্টা করবে বা আপনি এটি একটি তালিকা পাস করতে পারেন।

এছাড়াও, আমি চালানোর চেষ্টা করেছি:

$text = "fiancée";
echo mb_convert_encoding($text, "UTF-8");
echo "<br/><br/>";
echo iconv(mb_detect_encoding($text), "UTF-8", $text);

এবং ফলাফল উভয়ের জন্য একই। আপনি কীভাবে দেখতে পাচ্ছেন যে আপনার পাঠ্যটি 'বাগদত্ত' তে ছেটে গেছে? এটি ডিবিতে বা ব্রাউজারে রয়েছে?


ডাটাবেসে, দেখে মনে হচ্ছে - আপনার কোডটি নিয়ে আমার কেবল চেষ্টা ছিল এবং আমি সম্মত।
...

1
আপনি সারণী / কলামে সংজ্ঞায়িত কোলেশনটিও ইউটিএফ -8 রয়েছে তা নিশ্চিত করে দেখুন Check
আলেক্সি গেরাসিমভ

অ্যালেক্সা জিরাসিমভ আমার ধারণা, আমার সত্যিই তদন্ত করা দরকার iconv। আমি প্রায় খাঁটি এমবি_ * উপায় করার চেষ্টা করেছি। আপনি কি মনে করেন?
অ্যান্টনি রুটলেজ

5

কোনও স্ট্রিংয়ের চরসেটটি সনাক্ত করার কোনও উপায় নেই যা সম্পূর্ণ নির্ভুল। চরসেটটি অনুমান করার চেষ্টা করার উপায় রয়েছে। এই উপায়গুলির মধ্যে একটি, এবং সম্ভবত / বর্তমানে পিএইচপি-র সেরা, হ'ল এমবি_ডিটেক্ট_ এনকোডিং ()। এটি আপনার স্ট্রিংটি স্ক্যান করবে এবং নির্দিষ্ট অক্ষরে অক্ষরের থেকে পৃথক স্টাফের উপস্থিতি সন্ধান করবে। আপনার স্ট্রিংয়ের উপর নির্ভর করে এই জাতীয় পার্থক্যগুলি নাও থাকতে পারে।

আইএসও -8859-1 চরসেট বনাম আইএসও -8859-15 নিন ( http://en.wikiki.org/wiki/ISO/IEC_8859-15# পরিবর্তন_ফ্রমে_আইএসও-8859-1 )

এখানে বিভিন্ন মুখ্য কয়েকটি চরিত্র রয়েছে এবং এটিকে আরও খারাপ করার জন্য এগুলি একই বাইট দ্বারা উপস্থাপিত হয়েছে। এটির এনকোডিং না জেনে স্ট্রিং দেওয়ার কোনও উপায় নেই, বাইট 0xA4 আপনার স্ট্রিংয়ে ¤ বা € বোঝাচ্ছে কিনা, সুতরাং এটি সঠিক অক্ষরটি জানার উপায় নেই।

(দ্রষ্টব্য: আপনি কোনও মানবিক উপাদান বা আরও উন্নত স্ক্যানিং কৌশল যুক্ত করতে পারেন (যেমন ওরোবোরাস ১০২ কী বোঝায়) পার্শ্ববর্তী প্রেক্ষাপটের উপর ভিত্তি করে চিত্র বের করার চেষ্টা করতে, যদি চরিত্রটি ¤ বা try হওয়া উচিত, যদিও এটি ব্রিজের মতো মনে হয় অনেক দূরে)

উদাহরণস্বরূপ ইউটিএফ -8 এবং আইএসও -8859-1 এর মধ্যে আরও পার্থক্যযোগ্য পার্থক্য রয়েছে, সুতরাং আপনি যখন অনিশ্চিত হন তখন এটি নির্ধারণ করার চেষ্টা করা মূল্যবান, যদিও আপনি এটি সঠিক হওয়ার উপর নির্ভর করতে পারেন না এবং কখনই পারেন না।

আকর্ষণীয় পড়ুন: http://kore-nordmann.de/blog/php_charset_encoding_FAQ.html#how-do-i-determine-the-charset-encoding-of-a-string

সঠিক চরসেটটি নিশ্চিত করার অন্যান্য উপায় রয়েছে। ফর্মগুলি সম্পর্কিত, যতটা সম্ভব ইউটিএফ -8 কার্যকর করার চেষ্টা করুন (প্রতিটি ব্রাউজারে আপনার জমাটি ইউটিএফ -8 হবে তা নিশ্চিত করার জন্য স্নোম্যান পরীক্ষা করে দেখুন: http://intertwingly.net/blog/2010/07/29/Rails- and -মোহন ) এটি করা হচ্ছে, কমপক্ষে আপনি নিশ্চিত হতে পারেন যে আপনার ফর্মগুলির মাধ্যমে জমা দেওয়া প্রতিটি পাঠ্য utf_8। আপলোড করা ফাইলগুলি সম্পর্কিত, এটির জন্য ইউনিক্স 'ফাইল -i' কমান্ডটি চালনার চেষ্টা করুন যেমন এক্সিকিউট () আপনার সার্ভারে সম্ভব হলে) সনাক্তকরণে সহায়তা করতে (ডকুমেন্টের বিওএম ব্যবহার করে)) স্ক্র্যাপিং ডেটা সম্পর্কিত, আপনি HTTP শিরোনাম পড়তে পারেন, যা সাধারণত চরসেট নির্দিষ্ট করে। এক্সএমএল ফাইলগুলি বিশ্লেষণ করার সময়, এক্সএমএল মেটা-ডেটাতে চারসেট সংজ্ঞা রয়েছে কিনা তা দেখুন।

চরসেটটি স্বয়ংক্রিয়ভাবে অনুমান করার চেষ্টা করার পরিবর্তে প্রথমে আপনার নিজের যেখানে সম্ভব সেখানে একটি নির্দিষ্ট চার্সেট নিশ্চিত করার চেষ্টা করা উচিত, বা সনাক্তকরণের আশ্রয় নেওয়ার আগে আপনি যদি উত্সটি (যদি প্রযোজ্য) থেকে পেয়েছেন তবে তার থেকে একটি সংজ্ঞা গ্রহণ করার চেষ্টা করা উচিত।


এনক্রিপ্ট করা ডেটা সহ ফর্ম এবং ইমেল নিবন্ধের লিঙ্কগুলি। সেখান থেকে আমি আমার ইনপুটটি ইউটিএফ -8 বা কিছুই হতে চাই না। আপনি আমার উত্তর সম্পর্কে কি মনে করেন? সহায়ক মন্তব্য প্রশংসা করা হয়। ধন্যবাদ।
অ্যান্টনি রটলেজ

3

এখানে কিছু সত্যই ভাল উত্তর এবং আপনার প্রশ্নের উত্তর দেওয়ার চেষ্টা আছে। আমি কোনও এনকোডিংয়ের মাস্টার নই, তবে আপনার ডাটাবেসের মাধ্যমে পুরো খাঁটি ইউটিএফ -8 স্ট্যাকের আকাঙ্ক্ষাটি আমি বুঝতে পারি । আমি utf8mb4টেবিল, ক্ষেত্র এবং সংযোগগুলির জন্য মাইএসকিউএল এর এনকোডিং ব্যবহার করছি।

আমার পরিস্থিতি "এইচটিএমএল ফর্মগুলি বা ইমেল নিবন্ধ লিঙ্কগুলি থেকে ডেটা আসে তখন আমি কেবলমাত্র আমার স্যানিটাইজার, বৈধকারক, ব্যবসায়িক যুক্তি এবং ইউটিএফ -8 মোকাবিলার জন্য প্রস্তুত বিবৃতি চাই to" সুতরাং, আমার সহজ উপায়ে, আমি এই ধারণাটি দিয়ে শুরু করেছি:

  1. এনকোডিং সনাক্ত করার চেষ্টা: $encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];
  2. যদি এনকোডিং সনাক্ত করা যায় না, throw new RuntimeException
  3. যদি ইনপুট থাকে তবে UTF-8চালিয়ে যান।
  4. অন্যথায়, যদি হয় ISO-8859-1বা হয়ASCII

    ক। ইউটিএফ -8 এ রূপান্তর করার চেষ্টা করুন (অপেক্ষা করুন, শেষ হয়নি)

    খ। রূপান্তরিত মানটির এনকোডিং সনাক্ত করুন

    গ। যদি প্রতিবেদিত এনকোডিং এবং রূপান্তরিত মান দুটি হয় তবে UTF-8চালিয়ে যান।

    ঘ। অন্যথায়,throw new RuntimeException

আমার বিমূর্ত ক্লাস থেকে Sanitizer

sanitizer

    private function isUTF8($encoding, $value)
    {
        return (($encoding === 'UTF-8') && (utf8_encode(utf8_decode($value)) === $value));
    }

    private function utf8tify(&$value)
    {
        $encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];

        mb_internal_encoding('UTF-8');
        mb_substitute_character(0xfffd); //REPLACEMENT CHARACTER
        mb_detect_order($encodings);

        $stringEncoding = mb_detect_encoding($value, $encodings, true);

        if (!$stringEncoding) {
            $value = null;
            throw new \RuntimeException("Unable to identify character encoding in sanitizer.");
        }

        if ($this->isUTF8($stringEncoding, $value)) {
            return;
        } else {
            $value = mb_convert_encoding($value, 'UTF-8', $stringEncoding);
            $stringEncoding = mb_detect_encoding($value, $encodings, true);

            if ($this->isUTF8($stringEncoding, $value)) {
                return;
            } else {
                $value = null;
                throw new \RuntimeException("Unable to convert character encoding from ISO-8859-1, or ASCII, to UTF-8 in Sanitizer.");
            }
        }

        return;
    }

কেউ একটি যুক্তি তৈরি করতে পারে যে আমার অ্যাবস্ট্রাক্ট ক্লাস থেকে আমার এনকোডিং উদ্বেগগুলি আলাদা করা উচিত Sanitizerএবং কেবলমাত্র Encoderএকটি কংক্রিটের শিশুদের উদাহরণে কোনও বস্তু ইনজেক্ট করা উচিত Sanitizer। যাইহোক, আমার পদ্ধতির সাথে মুখ্য সমস্যাটি হ'ল, বেশি জ্ঞান ছাড়াই আমি কেবল চাই না এমন এনকোডিংয়ের ধরণগুলি আমি প্রত্যাখ্যান করি (এবং আমি পিএইচপি এমবি_ * ফাংশনগুলির উপর নির্ভর করছি)। আরও অধ্যয়ন ছাড়া, আমি জানি না যে এটি কিছু জনগোষ্ঠীর ক্ষতি করে কিনা না (বা, যদি আমি গুরুত্বপূর্ণ তথ্য হারাতে পারি)। সুতরাং, আমার আরও শিখতে হবে। আমি এই নিবন্ধটি খুঁজে পেয়েছি।

প্রতিটি প্রোগ্রামার একেবারে কী, পাঠ্যের সাথে কাজ করার জন্য এনকোডিংগুলি এবং চরিত্রের সেট সম্পর্কে ইতিবাচকভাবে জানতে হবে

তদুপরি, এনক্রিপ্ট করা ডেটা যখন আমার ইমেল নিবন্ধকরণ লিঙ্কগুলিতে যুক্ত হয় (ব্যবহৃত হয় OpenSSLবা mcrypt)? এটি কি ডিকোডিংয়ের সাথে হস্তক্ষেপ করতে পারে? উইন্ডোজ -১২২২ নিয়ে কী হবে? সুরক্ষা জড়িত সম্পর্কে কী? ব্যবহারের utf8_decode()এবং utf8_encode()মধ্যে Sanitizer::isUTF8সন্দেহজনক হয়।

পিএইচপি এমবি_ * ফাংশনগুলিতে লোকেরা সংক্ষিপ্ত-মন্তব্যগুলি দেখিয়েছে। আমি কখনই তদন্তের জন্য সময় নিইনি iconvতবে এটি যদি এমবি_ * ফাংশনগুলির চেয়ে আরও ভাল কাজ করে তবে আমাকে জানান।


আমি এই পাওয়া stackoverflow.com/a/3521396/1429677 এই সমস্যাটি চমৎকার উত্তর, এখানে liberal এর সংক্ষিপ্ত রূপ হল github.com/neitanod/forceutf8
Llewellyn

2

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

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

যদি এটি কোনও ফাইল হয় তবে আপনি এটি ইউটিএফ -8 ডাটাবেজে এনকোডযুক্ত নয় বাইনারি আকারে সংরক্ষণ করতে পারবেন। আপনি যখন ফাইলটি আবার আউটপুট করেন তখন বাইনারি আউটপুটও ব্যবহার করুন, তবে এটি সম্পূর্ণ স্বচ্ছ।

আপনার ধারণাটি দুর্দান্ত যে কোনও ব্যবহারকারী এনকোডিংটি বলতে পারে, ফাইলটি ডাউনলোড করার পরে সে যেভাবেই বলতে পারে যেমন এটি বাইনারি।

সুতরাং আমি অবশ্যই স্বীকার করব যে আপনি আপনার প্রশ্নটি উত্থাপিত কোনও নির্দিষ্ট সমস্যা দেখছি না। তবে আপনার সমস্যাটি কী হতে পারে আপনি আরও কিছু বিশদ যোগ করতে পারেন।


আপনি আমার উত্তর দিয়ে দেখতে এবং ইস্যু করতে চান? গঠনমূলক মন্তব্য প্রশংসা করা হয়। ধন্যবাদ।
অ্যান্টনি রটলেজ

1

কোন এনকোডিংটি ব্যবহার হচ্ছে তা অনুমান করার জন্য আপনি মেট্রিকের একটি সেট সেট আপ করতে পারেন। আবার, নিখুঁত নয়, তবে mb_detect_encoding () থেকে কিছু মিস করেছে।


হ্যাঁ, mb_detect_encoding()মিসের কথা ভাল করে বলতে গেলে , আপনি কি মনে করেন যে আমার উত্তরে সাহারাতে গ্রীষ্মে একটি তুষারবলের সুযোগ আছে?
অ্যান্টনি রটলেজ

1

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

encaএছাড়াও এখানে এসেছিলেন: ইউনিক্সে স্ক্রিপ্ট (গুলি) এর মাধ্যমে কোনও ফাইলের এনকোডিং কীভাবে পাওয়া যায়


1

দেখে মনে হচ্ছে আপনার প্রশ্নের যথেষ্ট উত্তর দেওয়া হয়েছে তবে আমার কাছে এমন একটি পদ্ধতির সমাধান রয়েছে যা আপনাকে কেসকে সহজতর করতে পারে:

আমি মাইএসকিএল থেকে স্ট্রিং ডেটা ফেরত দেওয়ার চেষ্টা করে একই ধরণের সমস্যা পেয়েছিলাম, এমনকি ডাটাবেস এবং পিএইচপি উভয়ই কনফিগার করে স্ট্রিংগুলি utf-8 এ ফর্ম্যাট করে ফিরিয়ে আনতে পারি। আমি যে ত্রুটিটি পেয়েছি তার মধ্যে কেবলমাত্র ডাটাবেস থেকে সেগুলি ফিরিয়ে দেওয়া।

অবশেষে, ওয়েবের মাধ্যমে যাত্রা করে আমি এটির সাথে মোকাবিলা করার একটি খুব সহজ উপায় খুঁজে পেয়েছি:

আপনি যে কোনও ধরণের স্ট্রিং ডেটা আপনার মাইএসকিএল-এ বিভিন্ন ফর্ম্যাট এবং কোলিশনে সংরক্ষণ করতে পারবেন তা আপনাকে আপনার পিএইচপি সংযোগ ফাইলে সরাসরি কোটেশনটি utf-8 এ সেট করতে হবে:

$connection = new mysqli($server, $user, $pass, $db);
$connection->set_charset("utf8");

যার অর্থ হ'ল প্রথমে আপনি কোনও বিন্যাসে বা কোলেশনে ডেটা সংরক্ষণ করেন এবং আপনি কেবলমাত্র আপনার পিএইচপি ফাইলে ফিরলে এটিকে রূপান্তর করেন।

আশা করি এটি সহায়ক ছিল!



-2
public function convertToUtf8($text) {
    if(!$this->html)
        $this->html = cURL('http://'.$this->url, array('timeout' => 15));

    $html = $this->html;
    preg_match('/<meta.*?charset=(|\")(.*?)("|\")/i', $html, $matches);

    $charset = $matches[2];

    if($charset)
        return mb_convert_encoding($text, 'UTF-8', $charset);
    else
        return $text;
}

সিআরএল ডিফল্ট বিকল্পগুলি:

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

আমি এরকম কিছু চেষ্টা করেছি। এটা আমাকে সাহায্য করেছে। যদি মেটা চরসেট তথ্যে পাওয়া যায়, আমি রূপান্তর করছি, অন্যথায় কিছুই করছি না।


ত্রুটি, আপনি দয়া করে আপনার ফাংশন পরীক্ষা করে ভেরিয়েবলগুলি সংশোধন করতে পারেন?
মার্টিন

ইউআরএল কী? $ এইচটিএমএল কী?
মার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.