এনকোডিং সনাক্ত করুন এবং সবকিছু ইউটিএফ -8 করুন


304

আমি বিভিন্ন আরএসএস ফিড থেকে প্রচুর পাঠ্য পড়ছি এবং সেগুলি আমার ডাটাবেসে intoুকিয়ে দিচ্ছি।

অবশ্যই, ফিডে বেশ কয়েকটি পৃথক অক্ষর এনকোডিং রয়েছে, যেমন ইউটিএফ -8 এবং আইএসও 8859-1।

দুর্ভাগ্যক্রমে, পাঠ্যগুলির এনকোডিংগুলির সাথে কখনও কখনও সমস্যা রয়েছে। উদাহরণ:

  1. "ফুবুল" এর "ß" আমার ডেটাবেজে এটির মতো দেখা উচিত: "Ÿ"। এটি যদি "Ÿ" হয় তবে এটি সঠিকভাবে প্রদর্শিত হয়।

  2. কখনও কখনও, "ফুবুল" এর "ß" আমার ডাটাবেসে এইরকম দেখায়: "ß"। তারপরে অবশ্যই এটি ভুলভাবে প্রদর্শিত হয়।

  3. অন্যান্য ক্ষেত্রে, "ß" "ß" হিসাবে সংরক্ষণ করা হয় - সুতরাং কোনও পরিবর্তন ছাড়াই। তারপরে এটিও ভুলভাবে প্রদর্শিত হয়।

2 এবং 3 কেস এড়াতে আমি কী করতে পারি?

আমি কীভাবে সমস্ত জিনিসকে একই এনকোডিং করব, পছন্দমতো ইউটিএফ -8? আমি কখন ব্যবহার করব utf8_encode(), কখন অবশ্যই ব্যবহার করবutf8_decode() (এফেক্টটি কী তা স্পষ্ট তবে কখন আমাকে ফাংশনগুলি ব্যবহার করা উচিত?) এবং কখন ইনপুট দিয়ে আমার কিছু করা উচিত নয়?

আমি কীভাবে সবকিছুকে একই এনকোডিং করব? সম্ভবত ফাংশন দিয়ে mb_detect_encoding()? আমি কি এর জন্য একটি ফাংশন লিখতে পারি? সুতরাং আমার সমস্যাগুলি হ'ল:

  1. পাঠ্যটি কী কী এনকডিং ব্যবহার করে তা আমি কীভাবে খুঁজে বের করব?
  2. আমি কীভাবে এটি ইউটিএফ -8 এ রূপান্তর করব - পুরাতন এনকোডিং যাই হোক না কেন?

এই কাজের মতো কোনও কাজ করবে?

function correct_encoding($text) {
    $current_encoding = mb_detect_encoding($text, 'auto');
    $text = iconv($current_encoding, 'UTF-8', $text);
    return $text;
}

আমি এটি পরীক্ষা করেছি, কিন্তু এটি কাজ করে না। এতে দোষ কী?


36
"ফুবল" এর "ß" এর মতো দেখতে আমার ডাটাবেসে দেখা উচিত: "Ÿ"। না এটি ß এর মতো দেখতে হবে ß নিশ্চিত করুন যে আপনার কোলেশন এবং সংযোগটি সঠিকভাবে সেট আপ হয়েছে। অন্যথায় বাছাই এবং অনুসন্ধান আপনার জন্য ভেঙে যাবে।
ধনী ব্র্যাডশো

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

2
ব্যবহার: E থেকে = এমবি_ডেসটেক্ট_এনকোডিং ($ পাঠ্য); $ টেক্সট = mb_convert_encoding ($ টেক্সট, 'হল UTF-8', $ থেকে);
Informate.it

উত্তর:


363

আপনি যদি utf8_encode()ইতিমধ্যে একটি ইউটিএফ -8 স্ট্রিংয়ে আবেদন করেন তবে এটি গারলেড ইউটিএফ -8 আউটপুটটি ফিরিয়ে দেবে।

আমি একটি ফাংশন তৈরি করেছি যা এই সমস্ত সমস্যার সমাধান করে। এটি বলা হয় Encoding::toUTF8()

আপনার স্ট্রিংগুলির এনকোডিং কী তা আপনার জানতে হবে না। এটি ল্যাটিন 1 ( আইএসও 8859-1) , উইন্ডোজ -1222 বা ইউটিএফ -8 হতে পারে, বা স্ট্রিংটিতে এগুলির একটি মিশ্রণ থাকতে পারে। Encoding::toUTF8()সবকিছুকে ইউটিএফ -8 এ রূপান্তর করবে।

আমি এটি করেছি কারণ একটি পরিষেবা আমাকে সমস্ত গণ্ডগোলের ডেটা ফিড দিচ্ছিল, একই স্ট্রিংয়ে ইউটিএফ -8 এবং লাতিন 1 মিশ্রণ করছিল।

ব্যবহার:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

ডাউনলোড করুন:

https://github.com/neitanod/forceutf8

আমি অন্য একটি ফাংশন অন্তর্ভুক্ত করেছি Encoding::fixUFT8(), যা প্রতিটি UTF-8 স্ট্রিং যা গার্ফড দেখায় তা ঠিক করবে।

ব্যবহার:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

উদাহরণ:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

আউটপুট হবে:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

আমি ফাংশনটি ( forceUTF8) নামক শ্রেণিতে স্থির ফাংশনগুলির একটি পরিবারে রূপান্তর করেছি Encoding। নতুন ফাংশনটি হ'ল Encoding::toUTF8()


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

3
এই অবৈধ অক্ষরগুলির এনকোডিংটি কী শুরু হবে তা না জেনে কিভাবে এটি নন-ইউটিএফ 8 অক্ষরকে ইউটিএফ 8 এ রূপান্তর করবে?
ফিলফ্রেও

4
এটি আইএসও -8859-1 ধরে নিয়েছে, উত্তর ইতিমধ্যে এটি বলেছে। ফোর্সআউটএফ 8 () এবং ইউটিএফ 8_এনকোড () এর মধ্যে কেবলমাত্র পার্থক্য হ'ল ফোর্সআউটএফ 8 () ইউটিএফ 8 অক্ষর সনাক্ত করে এবং তাদের অপরিবর্তিত রাখে।
সেবাস্তিয়ান গ্রিগনোলি

28
"আপনার স্ট্রিংগুলির এনকোডিং কী তা আপনার জানতে হবে না।" - আমি খুব একমত না। অনুমান করা এবং চেষ্টা করা কার্যকর হতে পারে তবে আপনি সবসময় তাড়াতাড়ি বা পরে প্রান্তের মামলাগুলির মুখোমুখি হবেন যেখানে এটি হয় না।
ছদ্মবেশ

4
আমি সম্পূর্ণভাবে রাজী. আসলে, আমি বলতে চাইছিলাম না যে একটি সাধারণ নিয়ম হিসাবে, কেবল ব্যাখ্যা করুন যে এই শ্রেণিটি আপনাকে সহায়তা করতে পারে যদি সেই পরিস্থিতিতে আপনি নিজেকে আবিষ্কার করার মতো পরিস্থিতি তৈরি হন
সেবাস্তিয়ান গ্রিগনোলি

74

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


সম্পাদনা    আমি সম্ভবত এটি করতে হবে এখানে:

আমি প্রতিক্রিয়া পাঠাতে এবং আনতে cURL ব্যবহার করব । এটি আপনাকে নির্দিষ্ট শিরোনাম ক্ষেত্রগুলি সেট করতে এবং পাশাপাশি প্রতিক্রিয়া শিরোনাম আনতে সহায়তা করে। প্রতিক্রিয়াটি আনার পরে, আপনাকে HTTP প্রতিক্রিয়াটি পার্স করতে হবে এবং এটিকে শিরোনাম এবং শরীরে বিভক্ত করতে হবে। এর পরে শিরোনামের মধ্যে Content-Typeশিরোনামের ক্ষেত্র থাকতে হবে যাতে MIME টাইপ থাকে এবং (আশা করা যায়) charsetএনকোডিং / চরসেট সহ পরামিতিও থাকে। যদি তা না হয় তবে আমরা গুনটির উপস্থিতির জন্য এক্সএমএল পিআই বিশ্লেষণ করব encodingএবং সেখান থেকে এনকোডিং করব। যদি এটিও অনুপস্থিত থাকে তবে এক্সএমএল স্পেসগুলি ইউটিএফ -8 এনকোডিং হিসাবে ব্যবহার করার জন্য সংজ্ঞা দেয়।

$url = 'http://www.lr-online.de/storage/rss/rss/sport.xml';

$accept = array(
    'type' => array('application/rss+xml', 'application/xml', 'application/rdf+xml', 'text/xml'),
    'charset' => array_diff(mb_list_encodings(), array('pass', 'auto', 'wchar', 'byte2be', 'byte2le', 'byte4be', 'byte4le', 'BASE64', 'UUENCODE', 'HTML-ENTITIES', 'Quoted-Printable', '7bit', '8bit'))
);
$header = array(
    'Accept: '.implode(', ', $accept['type']),
    'Accept-Charset: '.implode(', ', $accept['charset']),
);
$encoding = null;
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($curl);
if (!$response) {
    // error fetching the response
} else {
    $offset = strpos($response, "\r\n\r\n");
    $header = substr($response, 0, $offset);
    if (!$header || !preg_match('/^Content-Type:\s+([^;]+)(?:;\s*charset=(.*))?/im', $header, $match)) {
        // error parsing the response
    } else {
        if (!in_array(strtolower($match[1]), array_map('strtolower', $accept['type']))) {
            // type not accepted
        }
        $encoding = trim($match[2], '"\'');
    }
    if (!$encoding) {
        $body = substr($response, $offset + 4);
        if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $body, $match)) {
            $encoding = trim($match[1], '"\'');
        }
    }
    if (!$encoding) {
        $encoding = 'utf-8';
    } else {
        if (!in_array($encoding, array_map('strtolower', $accept['charset']))) {
            // encoding not accepted
        }
        if ($encoding != 'utf-8') {
            $body = mb_convert_encoding($body, 'utf-8', $encoding);
        }
    }
    $simpleXML = simplexml_load_string($body, null, LIBXML_NOERROR);
    if (!$simpleXML) {
        // parse error
    } else {
        echo $simpleXML->asXML();
    }
}

ধন্যবাদ। এটি সহজ হবে। কিন্তু এটি কি সত্যিই কাজ করবে? এইচটিটিপি শিরোনামগুলিতে বা এক্সএমএল বৈশিষ্ট্যগুলিতে প্রায়শই ভুল এনকোডিং থাকে।
কাওয়

25
আবার: এটি আপনার সমস্যা নয়। এই জাতীয় ঝামেলা এড়াতে স্ট্যান্ডার্ড প্রতিষ্ঠিত হয়েছিল। অন্যরা যদি তাদের অনুসরণ না করে তবে এটি তাদের নয়, এটি তাদের সমস্যা।
গম্বো

ঠিক আছে, আমি মনে করি আপনি অবশেষে আমাকে এখন নিশ্চিত করেছেন। :)
কাও

কোডের জন্য ধন্যবাদ। তবে কেন কেবল এটি ব্যবহার করবেন না? পেস্ট.ব্রেডলিগিল.com/index.php?paste_id=9651 আপনার কোডটি আরও জটিল, এর সাথে আরও ভাল কি?
কাও

ভাল, প্রথমে আপনি দুটি অনুরোধ করছেন, একটি HTTP শিরোনামের জন্য এবং একটি ডেটার জন্য। দ্বিতীয়ত, তোমাদের কেউ চেহারা খুঁজছেন charset=এবংencoding= এবং মাত্র উপযুক্ত অবস্থানের করেন। এবং তৃতীয়ত, আপনি ঘোষিত এনকোডিংটি গৃহীত হয়েছে কিনা তা পরীক্ষা করছেন না।
গম্বো

39

এনকোডিং সনাক্তকরণ শক্ত।

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

যতদিন আপনি শুধুমাত্র পশ্চিম ইউরোপীয় ভাষা সাথে মোকাবিলা হিসাবে, তিনটি প্রধান এনকোডিং বিবেচনা করতে হয় utf-8, iso-8859-1এবং cp-1252। যেহেতু এগুলি অনেকগুলি প্ল্যাটফর্মের জন্য খেলাপি হয় তাই এগুলি সম্পর্কেও ভুলভাবে রিপোর্ট করা সম্ভবত। যেমন। লোকেরা যদি বিভিন্ন এনকোডিংগুলি ব্যবহার করে তবে তারা এ সম্পর্কে খোলামেলা হওয়ার সম্ভাবনা রয়েছে কারণ অন্যথায় তাদের সফ্টওয়্যারটি প্রায়শই ব্রেক হয়ে যায়। অতএব, ভাল কৌশলটি সরবরাহকারীর উপর নির্ভর করা, যদি না এই তিনটির মধ্যে একটি হিসাবে এনকোডিংটি রিপোর্ট করা হয়। আপনি এখনও doublecheck উচিত যে এটা সত্যিই বৈধ, ব্যবহার mb_check_encoding(নোট যে বৈধ হিসাবে একই নয় হচ্ছে - একই ইনপুট অনেক এনকোডিং জন্য বৈধ হতে পারে)। এটি যদি এর মধ্যে একটি হয় তবে আপনি এটি ব্যবহার করতে পারেনmb_detect_encodingতাদের মধ্যে পার্থক্য করা। ভাগ্যক্রমে যে মোটামুটি নির্দোষ; আপনার কেবল সঠিক সনাক্তকরণ-সিকোয়েন্সটি ব্যবহার করা দরকার যা এটি UTF-8,ISO-8859-1,WINDOWS-1252

একবার এনকোডিং শনাক্ত করার পরে আপনাকে এটিকে আপনার অভ্যন্তরীণ উপস্থাপনায় রূপান্তর করতে হবে ( UTF-8একমাত্র বুদ্ধিমান পছন্দ)। ফাংশন utf8_encodeরূপান্তরISO-8859-1 করে UTF-8, সুতরাং এটি কেবলমাত্র সেই নির্দিষ্ট ইনপুট ধরণের জন্যই ব্যবহৃত হতে পারে। অন্যান্য এনকোডিংয়ের জন্য ব্যবহার করুন mb_convert_encoding


আপনাকে অনেক ধন্যবাদ! আরও ভাল কি: এমবি-রূপান্তর-এনকোডিং () বা আইকনভি ()? পার্থক্য কী তা আমি জানি না। হ্যাঁ, আমাকে কেবল পশ্চিমা ইউরোপীয় ভাষাগুলি, বিশেষত ইংরাজী, জার্মান এবং ফ্রেঞ্চ ars
কাও

7
আমি সবেমাত্র দেখেছি: এমবি-ডিটেক্ট-এনকোডিং () নিখরচায়। এটি কেবল ইউটিএফ -8, ইউটিএফ -7, এএসসিআইআই, ইইউসি-জেপি, এসজেআইএস, ইউকিজেপি-উইন, এসজেআইএস-জয়, জেআইএস এবং আইএসও -2022-জেপি সমর্থন করে। আমার জন্য সর্বাধিক গুরুত্বপূর্ণ, আইএসও -8859-1 এবং উইন্ডো -1222 সমর্থিত নয়। সুতরাং আমি এমবি-ডিটেক্ট-এনকোডিং () ব্যবহার করতে পারি না।
কাও

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

আমি মনে করি আপনি যে বিশেষ ফর্মগুলি উত্থাপন করেছেন সেই ফর্মগুলির দিকে নজর দিলে আপনি বিভিন্ন এনকোডিংগুলিকে আলাদা করতে পারেন: জার্মান "ß" বিভিন্ন রূপে উদ্ভূত হয়: কখনও কখনও "Ÿ", কখনও কখনও "ß" এবং কখনও কখনও "ß"। কেন?
কাও

হ্যাঁ, তবে তারপরে তুলনা করার আগে আপনাকে স্ট্রিংয়ের বিষয়বস্তুগুলি জানতে হবে এবং এই ধরণের উদ্দেশ্যটি প্রথম স্থানে পরাস্ত করে। জার্মান ß আলাদাভাবে উপস্থিত হয় কারণ এর বিভিন্ন এনকোডিংয়ে বিভিন্ন মান রয়েছে। সোমস অক্ষরগুলি বিভিন্ন এনকোডিংগুলিতে একইভাবে উপস্থাপিত হতে দেখা যায় (যেমন ascii চরসেটের সমস্ত অক্ষর utf-8, iso-8859- * এবং wp-1252 তে একইভাবে এনকোড করা থাকে), যতক্ষণ আপনি ব্যবহার করবেন কেবল সেই চরিত্রগুলি, তারা সমস্ত দেখতে একই রকম। এ কারণেই এগুলিকে কিছু সময় ascii- সামঞ্জস্যপূর্ণ বলা হয়।
আফ্রোস্কেন

14

একটি সত্যিই একটি বাস্তবায়ন সুন্দর ভাবে isUTF8-function পাওয়া যাবে php.net :

function isUTF8($string) {
    return (utf8_encode(utf8_decode($string)) == $string);
}

16
দুর্ভাগ্যক্রমে, এটি কেবল তখনই কার্যকর হয় যখন স্ট্রিংটিতে কেবলমাত্র অক্ষর থাকে যা ISO-8859-1-এ অন্তর্ভুক্ত থাকে। তবে এটি কাজ করতে পারে: @ আইকনভ ('utf-8', 'utf-8 // IGNORE', $ str) == $ str
ক্রিশ্চিয়ান দাভান

@ ক্রিশ্চিয়ান: সত্যই, হাই পারফরম্যান্স মাইএসকিউএল এর লেখকরাও এটাই সুপারিশ করেন।
অ্যালিক্স অ্যাক্সেল

1
এটি সঠিকভাবে কাজ করে না: প্রতিধ্বনি (int) isUTF8 ('z'); # 1 প্রতিধ্বনি (int) isUTF8 (NULL); # 1
ইউশা আলেয়াউব

1
নিখুঁত না হলেও, আমি মনে করি স্কেচি ইউটিএফ -8 চেকটি প্রয়োগের এটি একটি দুর্দান্ত উপায়।
মেটেং

1
mb_check_encoding($string, 'UTF-8')
deceze

13

এই চিটশিটটি পিএইচপি-তে ইউটিএফ -8 হ্যান্ডলিং সম্পর্কিত কিছু সাধারণ ক্যাভ্যাটকে তালিকাবদ্ধ করে: http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

একটি স্ট্রিংয়ের মাল্টিবাইট অক্ষর সনাক্তকরণ এই ফাংশনটি সহায়ক ( উত্স ) প্রমাণও করতে পারে :


function detectUTF8($string)
{
    return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
        )+%xs', 
    $string);
}


2
আমি মনে করি এটি সঠিকভাবে কাজ করে না: প্রতিধ্বনি সনাক্তকারী F8 ('3٣3'); # 1
ইউশা আলেয়াউব

10

একটু মাথা উপরে উঠল। আপনি বলেছিলেন যে "ß" আপনার ডাটাবেসে "Ÿ" হিসাবে প্রদর্শিত হবে।

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

Mysql_set_charset একবার দেখুন । এটি আপনাকে সাহায্য করতে পারে।


4

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

আপনি যা করেছেন তার কয়েকটি সিউডোকোড এখানে রয়েছে:

$inputstring = getFromUser();
$utf8string = iconv($current_encoding, 'utf-8', $inputstring);
$flawedstring = iconv($current_encoding, 'utf-8', $utf8string);

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

  1. এনকোডিং ব্যবহার করে mb_detect_encoding()বা যা ব্যবহার করতে চান তা সনাক্ত করুন
  2. এটি যদি ইউটিএফ -8 হয় তবে আইএসও 8859-1 এ রূপান্তর করুন এবং পদক্ষেপ 1 পুনরাবৃত্তি করুন
  3. শেষ পর্যন্ত, ইউটিএফ -8 এ ফিরে রূপান্তর করুন

এটি ধরে নেওয়া হচ্ছে যে "মাঝারি" রূপান্তরটিতে আপনি আইএসও 8859-1 ব্যবহার করেছেন। আপনি যদি উইন্ডোজ -১২২২ ব্যবহার করেন তবে উইন্ডোজ -১২২২ (ল্যাটিন ১) এ রূপান্তর করুন। মূল উত্স এনকোডিং গুরুত্বপূর্ণ নয়; আপনি যেটি ত্রুটিযুক্ত ব্যবহার করেছিলেন, তা দ্বিতীয় রূপান্তর।

এটি আমার অনুমান যা ঘটেছিল; আপনার বর্ধিত ASCII বাইটের জায়গায় চারটি বাইট পেতে আপনি অন্য কিছু করতে পারতেন না।

জার্মান ভাষাও আইএসও 8859-2 এবং উইন্ডোজ -1250 (ল্যাটিন -2) ব্যবহার করে।


3

মজার বিষয় mb_detect_encodingএবং mb_convert_encodingএটি হ'ল আপনার প্রস্তাবিত এনকোডিংগুলির ক্রমটি গুরুত্বপূর্ণ:

// $input is actually UTF-8

mb_detect_encoding($input, "UTF-8", "ISO-8859-9, UTF-8");
// ISO-8859-9 (WRONG!)

mb_detect_encoding($input, "UTF-8", "UTF-8, ISO-8859-9");
// UTF-8 (OK)

সুতরাং প্রত্যাশিত এনকোডিংগুলি নির্দিষ্ট করার সময় আপনি একটি নির্দিষ্ট ক্রমটি ব্যবহার করতে চাইতে পারেন। তবুও, মনে রাখবেন যে এটি বোকা নয়।


2
এটি ঘটে কারণ ISO-8859-9 বাস্তবে কোনও বাইনারি ইনপুট গ্রহণ করবে। উইন্ডোজ -১২২২ এবং বন্ধুদের জন্য একই। আপনাকে এনকোডিংগুলির জন্য প্রথমে পরীক্ষা করতে হবে যা ইনপুট গ্রহণ করতে ব্যর্থ হতে পারে।
মিক্কো রেন্টালাইনেন

@ মিক্কো রেন্টালাইনেন, হ্যাঁ, আমার ধারণা ডক্সের এই অংশটি কিছু একই রকম বলেছে: php.net/manual/en/function.mb-detect-order.php#example-2985
হালিল Özgür

WHATWG এইচটিএমএল স্পেসটি উইন্ডোজ 1252 কে ডিফল্ট এনকোডিং হিসাবে সংজ্ঞায়িত করে, এটি ধরে নেওয়া বেশ নিরাপদ হওয়া উচিত if ($input_is_not_UTF8) $input_is_windows1252 = true;। আরও দেখুন: html.spec.whatwg.org/m মাল্টিপেজ/…
মিক্কো রেন্টালাইনেন

3

আপনাকে ইনপুটতে অক্ষর সেটটি পরীক্ষা করতে হবে যেহেতু প্রতিক্রিয়াগুলি বিভিন্ন এনকোডিং সহ কোডে আসতে পারে।

নিম্নলিখিত বিষয়বস্তু ব্যবহার করে সনাক্ত এবং অনুবাদ করে আমি সমস্ত সামগ্রী UTF-8 এ পাঠিয়েছি:

function fixRequestCharset()
{
  $ref = array(&$_GET, &$_POST, &$_REQUEST);
  foreach ($ref as &$var)
  {
    foreach ($var as $key => $val)
    {
      $encoding = mb_detect_encoding($var[$key], mb_detect_order(), true);
      if (!$encoding)
        continue;
      if (strcasecmp($encoding, 'UTF-8') != 0)
      {
        $encoding = iconv($encoding, 'UTF-8', $var[$key]);
        if ($encoding === false)
          continue;
        $var[$key] = $encoding;
      }
    }
  }
}

এই রুটিনটি দূরবর্তী হোস্ট থেকে আগত সমস্ত পিএইচপি ভেরিয়েবলগুলি ইউটিএফ -8 এ পরিণত করবে।

অথবা এনকোডিং সনাক্ত বা রূপান্তর করতে না পারলে মানটিকে অগ্রাহ্য করুন।

আপনি এটি আপনার প্রয়োজন অনুসারে কাস্টমাইজ করতে পারেন।

ভেরিয়েবলগুলি ব্যবহারের আগে কেবল এটির অনুরোধ করুন।


এনকোডিং তালিকায় পাস না করে এমবি_ডেসটেক্ট_র্ডার () ব্যবহার করার উদ্দেশ্য কী?
giorgio79

উদ্দেশ্যটি হল php.ini এ ব্যবহৃত সংজ্ঞায়িত এনকোডিংয়ের অ্যারে সিস্টেম কনফিগার করা। এটি তৃতীয় প্যারামিটার পূরণ করার জন্য mb_detect_encoding দ্বারা প্রয়োজনীয়।
কাভিলা

2

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

সুতরাং আপনি এনকোডিং সনাক্তকরণের জন্য সঠিক উপায়টি ব্যবহার করার চেষ্টা করতে পারেন এবং তারপরে কিছুটা স্বতঃ-সনাক্তকরণের (অনুমান করা) ফিরে যেতে পারেন।


আমি ফিডের তথ্য থেকে এনকোডিংটি পড়তে চাই না। ফিডের তথ্য ভুল হলে এটি সমান। আমি পাঠ্য থেকে এনকোডিং সনাক্ত করতে চাই।
কাও

@ marco92w: ঘোষিত এনকোডিংটি ভুল হলে এটি আপনার সমস্যা নয়। মজাদার জন্য স্ট্যান্ডার্ড স্থাপন করা হয়নি।
গম্বো

1
@ গম্বো: তবে আপনি যদি সত্যিকারের বিশ্বে কাজ করছেন তবে আপনাকে ভুল ঘোষিত এনকোডিংয়ের মতো জিনিসগুলি মোকাবেলা করতে সক্ষম হতে হবে। সমস্যাটি হ'ল কিছু পাঠ্য থেকে এনকোডিংটি অনুমান করা (সঠিকভাবে) অনুভব করা খুব কঠিন। স্ট্যান্ডার্ডগুলি দুর্দান্ত, তবে অনেকগুলি (সর্বাধিক?) পৃষ্ঠা / ফিডগুলি সেগুলি মেনে চলে না।
কেভিন ওরওকে

@ কেভিন ওউরকে: ঠিক, ঠিক আছে। এটাই আমার সমস্যা। @ গম্বো: হ্যাঁ, এটি আমার সমস্যা। আমি ফিডগুলি পড়তে এবং এগুলিকে একত্রিত করতে চাই। সুতরাং আমি অবশ্যই ভুল এনকোডিংগুলি সংশোধন করব।
কাও

@ marco92w: আপনি যদি সঠিক এনকোডিং এবং বর্তমান এনকোডিং না জানেন তবে আপনি এনকোডিংটি সংশোধন করতে পারবেন না। এবং যে এর কি charset/ encodingঘোষণার জন্য যদি: এনকোডিং বর্ণনা তথ্য এনকোড করা আছে।
গাম্বো

2

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি মনে করি একটি দরকারী উত্তর কখনই ব্যথা করে না। আমার ডেস্কটপ অ্যাপ্লিকেশন, এসকিউএলাইট এবং জিইটি / পোষ্ট ভেরিয়েবলগুলির মধ্যে আমার এনকোডিংয়ের সমস্যা ছিল। কিছু UTF-8 এ থাকবেন, কেউ ASCII তে থাকবেন এবং বিদেশী চরিত্রগুলি জড়িত থাকাকালীন মূলত সমস্ত কিছুই আঁতকে উঠবে।

এখানে আমার সমাধান। এটি আপনার জিইটি / পোষ্ট / অনুরোধগুলি স্ক্র্যাব করে (আমি কুকিজ বাদ দিয়েছি, তবে আপনি যদি সেগুলি যুক্ত করতে পারেন) প্রক্রিয়া করার আগে প্রতিটি পৃষ্ঠা লোডে। এটি একটি শিরোনামে ভাল কাজ করে। পিএইচপি সতর্কতা নিক্ষেপ করবে যদি এটি স্বয়ংক্রিয়ভাবে উত্স এনকোডিং সনাক্ত করতে না পারে, সুতরাং এই সতর্কতাগুলি @ এর মাধ্যমে দমন করা হবে।

//Convert everything in our vars to UTF-8 for playing nice with the database...
//Use some auto detection here to help us not double-encode...
//Suppress possible warnings with @'s for when encoding cannot be detected
try
{
    $process = array(&$_GET, &$_POST, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][@mb_convert_encoding($k,'UTF-8','auto')] = $v;
                $process[] = &$process[$key][@mb_convert_encoding($k,'UTF-8','auto')];
            } else {
                $process[$key][@mb_convert_encoding($k,'UTF-8','auto')] = @mb_convert_encoding($v,'UTF-8','auto');
            }
        }
    }
    unset($process);
}
catch(Exception $ex){}

উত্তরের জন্য ধন্যবাদ, জোকল। এমবি_কনভার্ট_এনকোডিং () ফাংশনটি আমাদের এখানে ইতিমধ্যে ছিল, তাই না? ;) সুতরাং আপনার উত্তরের একমাত্র নতুন জিনিস হ'ল সমস্ত ভেরিয়েবলের এনকোডিং পরিবর্তন করা।
কাও

2

আমি যুগে যুগে এনকোডিংয়ের সমাধানগুলি অনুসন্ধান করছিলাম এবং এই পৃষ্ঠাটি সম্ভবত বছরের পর বছর অনুসন্ধানের সমাপ্তি! আপনার উল্লিখিত কয়েকটি পরামর্শ আমি পরীক্ষা করেছি এবং আমার নোটগুলি এখানে:

এটি আমার পরীক্ষার স্ট্রিং:

এটি একটি "র‌্যাং রিটেন" স্ট্রিং তবে এটি আমি দেখতে চাই, বিশেষ রূপে দেখতে চাই, ফ্যান্টিকন দ্বারা রূপান্তরিত !! & এটাই!

হিসাবে সেট করা ক্ষেত্রের একটি ডাটাবেসে এই স্ট্রিংটি সংরক্ষণ করার জন্য আমি একটি INSERT করি utf8_general_ci

আমার পৃষ্ঠার অক্ষর সেটটি ইউটিএফ -8।

আমি যদি ঠিক একইভাবে একটি INSERT করি তবে আমার ডাটাবেসে আমার কিছু অক্ষর সম্ভবত মঙ্গল থেকে এসেছে ...

সুতরাং আমি তাদের কিছু "বুদ্ধিমান" ইউটিএফ -8 এ রূপান্তর করতে হবে। আমি চেষ্টা করেছিলাম utf8_encode(), কিন্তু তবুও এলিয়েন অক্ষররা আমার ডাটাবেসে আক্রমণ করছিল ...

সুতরাং আমি forceUTF88 নম্বর পোস্ট করা ফাংশনটি ব্যবহার করার চেষ্টা করেছি , তবে ডাটাবেসে স্ট্রিংটি সংরক্ষণ করা দেখে মনে হচ্ছে:

এটি একটি "রিং রিটেন" স্ট্রিং তবে এটি আমি দেখতে চাই, বিশেষ রূপে দেখতে চাই, রূপান্তরিত করে ফ্যান্টকন দিয়েছি !! & এটাই!

সুতরাং এই পৃষ্ঠায় আরও কিছু তথ্য সংগ্রহ করা এবং অন্যান্য পৃষ্ঠাগুলিতে অন্যান্য তথ্যের সাথে সেগুলিকে মার্জ করে আমি এই সমস্যার সমাধান দিয়ে আমার সমস্যাটি সমাধান করেছি:

$finallyIDidIt = mb_convert_encoding(
  $string,
  mysql_client_encoding($resourceID),
  mb_detect_encoding($string)
);

এখন আমার ডাটাবেসে আমার সাথে সঠিক এনকোডিং রয়েছে string

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

তবে ভাল, আমি কেবল আমার INSERT এর আগে পুনরায় এনকোডিং করি তাই এটি আমার পক্ষে সমস্যা নয়।


1
আপনি কেন UTF-8প্রথম স্থানে মাইএসকিএল-এর জন্য ক্লায়েন্ট এনকোডিং ব্যবহার করবেন না ? এইভাবে ম্যানুয়াল রূপান্তর প্রয়োজন হবে না
Esailija

2

এটা তোলে সরল: আপনি যখন এমন কিছু বিষয় যা হল UTF-8 নয় পেতে, আপনাকে অবশ্যই এনকোড যে মধ্যে হল UTF-8।

সুতরাং, যখন আপনি একটি নির্দিষ্ট ফিড আনছেন তখন আইএসও 8859-1 এটি পার্স করুন utf8_encode

তবে, আপনি যদি কোনও ইউটিএফ -8 ফিড আনছেন তবে আপনাকে কিছু করার দরকার নেই।


ধন্যবাদ! ঠিক আছে, আমি এমবি-ডিটেক্ট-এনকোডিং () ব্যবহার করে ফিডটি কীভাবে এনকোড করা হয়েছে তা জানতে পারি? তবে ফিডটি ASCII হলে আমি কী করব? ইউটিএফ 8-এনকোড () কেবল আইএসও -8859-1 থেকে ইউটিএফ -8-র জন্য নয়, তাই না?
কাও

এএসসিআইআই হ'ল আইএসও -8859-1 এবং ইউটিএফ -8 এর একটি উপসেট, সুতরাং utf8-encode ব্যবহার করে () পরিবর্তন করা উচিত নয় - যদি এটি আসলে ASCII হয়
মাইকেল বার্গওয়ার্ড

সুতরাং আমি সর্বদা utf8_encode ব্যবহার করতে পারি যদি এটি UTF-8 না হয়? এটি সত্যিই সহজ হবে। এমবি-ডিটেক্ট-এনকোডিং () অনুসারে যে পাঠ্যটি ASCII ছিল তাতে "& # 228;" রয়েছে। এটি কি এএসসিআইআই চরিত্র? নাকি এটি এইচটিএমএল?
কাও

এটি এইচটিএমএল। আসলে এটি এনকোডযুক্ত তাই যখন আপনি এটি কোনও নির্দিষ্ট পৃষ্ঠায় মুদ্রণ করেন এটি ঠিক আছে। আপনি যদি চান প্রথমে ut8_encode () করতে পারেন তবে html_entity_decode ()।
সেব

1
অক্ষর বাইট সিকোয়েন্স 0xC39F সহ ইউটিএফ -8 এ এনকোড করা হয়েছে। উইন্ডোজ -১২২২ দিয়ে ব্যাখ্যা করা, সেই ক্রমটি দুটি অক্ষর represents (0xC3) এবং Ÿ (0x9F) উপস্থাপন করে। এবং আপনি যদি এই বাইট ক্রমটি আবার ইউটিএফ -8 এর সাথে এনকোড করে থাকেন তবে উইন্ডোজ -1222-তে 0 প্রতিনিধিত্বকারী 0xC383 0xC29F পাবেন। সুতরাং আপনার ভুলটি হ'ল এই ইউটিএফ -8 এনকোডড ডেটা ইউটিএফ -8 ব্যতীত অন্য কোনও এনকোডিংয়ের সাথে হ্যান্ডেল করা। যে বাইট ক্রমটি আপনি দেখছেন এমন চরিত্র হিসাবে উপস্থাপন করা হয়েছে তা কেবল ব্যাখ্যার বিষয়। আপনি যদি অন্য কোনও এনকোডিং / চরসেট ব্যবহার করেন তবে আপনি সম্ভবত অন্যান্য অক্ষরগুলি দেখতে পাবেন।
গম্বো

1

php.net/mb_detect_encoding

echo mb_detect_encoding($str, "auto");

অথবা

echo mb_detect_encoding($str, "UTF-8, ASCII, ISO-8859-1");

ফলাফলগুলি কী তা আমি সত্যিই জানি না, তবে আমি আপনাকে আলাদা আলাদা এনকোডিং দিয়ে আপনার কিছু ফিড নেওয়ার পরামর্শ দিই এবং mb_detect_encodingকাজ করে কি না চেষ্টা করুন ।

আপডেট
অটো "ASCII, JIS, UTF-8, EUC-JP, SJIS" এর জন্য সংক্ষিপ্ত। এটি সনাক্ত করা চরসেটটি ফিরিয়ে দেয়, যা আপনি স্ট্রিংটিকে আইকনভের সাথে utf-8 এ রূপান্তর করতে ব্যবহার করতে পারেন ।

<?php
function convertToUTF8($str) {
    $enc = mb_detect_encoding($str);

    if ($enc && $enc != 'UTF-8') {
        return iconv($enc, 'UTF-8', $str);
    } else {
        return $str;
    }
}
?>

আমি এটি পরীক্ষা করিনি, সুতরাং কোনও গ্যারান্টি নেই। এবং সম্ভবত একটি সহজ উপায় আছে।


ধন্যবাদ. দ্বিতীয় তর্ক হিসাবে 'অটো' এবং 'ইউটিএফ -8, এএসসিআইআই, আইএসও -8859-1' এর মধ্যে পার্থক্য কী? 'অটো' আরও এনকোডিং বৈশিষ্ট্য আছে? তাহলে 'অটো' ব্যবহার করা ভাল, তাই না? যদি এটি সত্যিই কোনও বাগ ছাড়াই কাজ করে তবে আমার অবশ্যই কেবল "ASCII" বা "আইএসও -8859-1" "ইউটিএফ -8" এ পরিবর্তন করতে হবে। কিভাবে?
কাও

2
আপনার ফাংশন সব ক্ষেত্রে ভাল কাজ করে না। কখনও কখনও আমি একটি ত্রুটি পাই: বিজ্ঞপ্তি: আইকনভি (): ইনপুট স্ট্রিংয়ে একটি অবৈধ চরিত্র সনাক্ত করেছে ...
কা

1

@harpax আমার জন্য কাজ করেছে। আমার ক্ষেত্রে এটি যথেষ্ট ভাল:

if (isUTF8($str)) { 
    echo $str; 
}
else
{
    echo iconv("ISO-8859-1", "UTF-8//TRANSLIT", $str);
}

0

আপনার পিএইচপি স্ক্রিপ্টগুলি বাছাই করার পরে, মাইএসকিএলকে বলতে ভুলবেন না যে আপনি কী চরসেটটি পার করছেন এবং তা গ্রহণ করতে চান।

উদাহরণ: সেট অক্ষর utf8 সেট করুন

লাতিন 1 I / O সেশনে ল্যাটিন 1 টেবিলটিতে utf8 ডেটা পাস করা সেই ন্যক্কারজনক বার্ডফিটগুলি দেয়। আমি এটি অন্য প্রতিটি দিন অসকমার্সের দোকানে দেখি। পিছনে এবং চতুর্থ এটি সঠিক বলে মনে হতে পারে। তবে phpmyadmin সত্য দেখাবে। আপনি কী চরসেটটি পাস করছেন তা মাইএসকিএলকে বলার মাধ্যমে এটি আপনার জন্য মাইএসকিএল ডেটা রূপান্তর পরিচালনা করবে।

বিদ্যমান স্ক্র্যাম্বলড মাইএসকিএল ডেটা কীভাবে পুনরুদ্ধার করবেন তা আলোচনা করার আরেকটি থ্রেড। :)


0

এই সংস্করণটি জার্মান ভাষার জন্য তবে আপনি $ অক্ষর এবং E টেস্টারগুলি সংশোধন করতে পারেন

class CharsetDetector
{
private static $CHARSETS = array(
"ISO_8859-1",
"ISO_8859-15",
"CP850"
);
private static $TESTCHARS = array(
"€",
"ä",
"Ä",
"ö",
"Ö",
"ü",
"Ü",
"ß"
);
public static function convert($string)
{
    return self::__iconv($string, self::getCharset($string));
}
public static function getCharset($string)
{
    $normalized = self::__normalize($string);
    if(!strlen($normalized))return "UTF-8";
    $best = "UTF-8";
    $charcountbest = 0;
    foreach (self::$CHARSETS as $charset) {
        $str = self::__iconv($normalized, $charset);
        $charcount = 0;
        $stop   = mb_strlen( $str, "UTF-8");

        for( $idx = 0; $idx < $stop; $idx++)
        {
            $char = mb_substr( $str, $idx, 1, "UTF-8");
            foreach (self::$TESTCHARS as $testchar) {

                if($char == $testchar)
                {

                    $charcount++;
                    break;
                }
            }
        }
        if($charcount>$charcountbest)
        {
            $charcountbest=$charcount;
            $best=$charset;
        }
        //echo $text."<br />";
    }
    return $best;
}
private static function __normalize($str)
{

$len = strlen($str);
$ret = "";
for($i = 0; $i < $len; $i++){
    $c = ord($str[$i]);
    if ($c > 128) {
        if (($c > 247)) $ret .=$str[$i];
        elseif ($c > 239) $bytes = 4;
        elseif ($c > 223) $bytes = 3;
        elseif ($c > 191) $bytes = 2;
        else $ret .=$str[$i];
        if (($i + $bytes) > $len) $ret .=$str[$i];
        $ret2=$str[$i];
        while ($bytes > 1) {
            $i++;
            $b = ord($str[$i]);
            if ($b < 128 || $b > 191) {$ret .=$ret2; $ret2=""; $i+=$bytes-1;$bytes=1; break;}
            else $ret2.=$str[$i];
            $bytes--;
        }
    }
}
return $ret; 
}
private static function __iconv($string, $charset)
{
    return iconv ( $charset, "UTF-8" , $string );
}
}


0

শিরোনাম থেকে এনকোডিং পান এবং এটি UF-8 এ রূপান্তর করুন।

$post_url='http://website.domain';

/// Get headers ////////////////////////////////////////////////////////////
function get_headers_curl($url) 
{ 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL,            $url); 
    curl_setopt($ch, CURLOPT_HEADER,         true); 
    curl_setopt($ch, CURLOPT_NOBODY,         true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT,        15); 

    $r = curl_exec($ch); 
    return $r; 
}
$the_header = get_headers_curl($post_url);
/// check for redirect /////////////////////////////////////////////////
if (preg_match("/Location:/i", $the_header)) {
    $arr = explode('Location:', $the_header);
    $location = $arr[1];

    $location=explode(chr(10), $location);
    $location = $location[0];

$the_header = get_headers_curl(trim($location));
}
/// Get charset /////////////////////////////////////////////////////////////////////
if (preg_match("/charset=/i", $the_header)) {
    $arr = explode('charset=', $the_header);
    $charset = $arr[1];

    $charset=explode(chr(10), $charset);
    $charset = $charset[0];
    }
///////////////////////////////////////////////////////////////////////////////
// echo $charset;

if($charset && $charset!='UTF-8') { $html = iconv($charset, "UTF-8", $html); }

0

Ÿমোজিবাকে ß। আপনার ডাটাবেসে আপনার হেক্স থাকতে পারে

DF if the column is "latin1",
C39F if the column is utf8 -- OR -- it is latin1, but "double-encoded"
C383C5B8 if double-encoded into a utf8 column

আপনার পিএইচপি-তে কোনও এনকোডিং / ডিকোডিং ফাংশন ব্যবহার করা উচিত নয় ; পরিবর্তে, আপনার সঠিকভাবে ডেটাবেস এবং সংযোগ স্থাপন করা উচিত।

মাইএসকিউএল জড়িত থাকলে, দেখুন: utf8 টি অক্ষরের সাথে সমস্যা; যা আমি দেখি তা আমি সংরক্ষণ করি তা নয়


0

আমি এখানে সমাধান খুঁজে পাচ্ছি http://deer.org.ua/2009/10/06/1/

class Encoding
{
    /**
     * http://deer.org.ua/2009/10/06/1/
     * @param $string
     * @return null
     */
    public static function detect_encoding($string)
    {
        static $list = ['utf-8', 'windows-1251'];

        foreach ($list as $item) {
            try {
                $sample = iconv($item, $item, $string);
            } catch (\Exception $e) {
                continue;
            }
            if (md5($sample) == md5($string)) {
                return $item;
            }
        }
        return null;
    }
}

$content = file_get_contents($file['tmp_name']);
$encoding = Encoding::detect_encoding($content);
if ($encoding != 'utf-8') {
    $result = iconv($encoding, 'utf-8', $content);
} else {
    $result = $content;
}

আমি মনে করি @ খারাপ সিদ্ধান্ত, এবং deer.org.ua থেকে সমাধানে কিছু পরিবর্তন করুন;


0

সর্বাধিক ভোট দেওয়া উত্তর কার্যকর হয় না। এখানে আমার এবং আশা করি এটি সাহায্য করবে।

function toUTF8($raw) {
    try{
        return mb_convert_encoding($raw, "UTF-8", "auto"); 
    }catch(\Exception $e){
        return mb_convert_encoding($raw, "UTF-8", "GBK"); 
    }
}

1
আপনার কী অন্তর্দৃষ্টি আছে কেন বা আপনার ফাইলগুলি কীভাবে আলাদা ছিল? কোন অংশগুলি আপনার পক্ষে কাজ করে না? উদাহরণস্বরূপ: বড় হাতের অক্ষরের জার্মান অক্ষরগুলি সঠিকভাবে রূপান্তরিত হয়নি। কৌতূহলী, "জিবিকে" কী?
শেরিলহোমান

-1

আপনি যখন জাপানি এবং কোরিয়ান জাতীয় বহু ভাষা হ্যান্ডেল করার চেষ্টা করেন আপনি সমস্যার মধ্যে পড়তে পারেন। 'অটো' প্যারামিটার সহ mb_convert_encoding ভাল কাজ করে না। এমবি_ডেেক্টট_র্ডার সেট করা ('এএসসিআইআই, ইউটিএফ -8, জেআইএস, ইইউসি-জেপি, এসজেআইএস, ইইউসি-কেআর, ইউএইচসি') কার্যকর হয় না কারণ এটি EUC- * কে ভুলভাবে সনাক্ত করবে।

আমি উপসংহারে এসেছি যে যতক্ষণ ইনপুট স্ট্রিংগুলি এইচটিএমএল থেকে আসে ততক্ষণ এটিকে একটি মেটা উপাদানটিতে 'চরসেট' ব্যবহার করা উচিত। আমি সাধারণ এইচটিএমএল ডোম পার্সার ব্যবহার করি কারণ এটি অবৈধ এইচটিএমএল সমর্থন করে।

নীচের স্নিপেট একটি ওয়েব পৃষ্ঠা থেকে শিরোনাম উপাদান বের করে। আপনি যদি পুরো পৃষ্ঠাটি রূপান্তর করতে চান তবে আপনি কিছু লাইন মুছে ফেলতে চাইতে পারেন।

<?php
require_once 'simple_html_dom.php';

echo convert_title_to_utf8(file_get_contents($argv[1])), PHP_EOL;

function convert_title_to_utf8($contents)
{
    $dom = str_get_html($contents);
    $title = $dom->find('title', 0);
    if (empty($title)) {
        return null;
    }
    $title = $title->plaintext;
    $metas = $dom->find('meta');
    $charset = 'auto';
    foreach ($metas as $meta) {
        if (!empty($meta->charset)) { // html5
            $charset = $meta->charset;
        } else if (preg_match('@charset=(.+)@', $meta->content, $match)) {
            $charset = $match[1];
        }
    }
    if (!in_array(strtolower($charset), array_map('strtolower', mb_list_encodings()))) {
        $charset = 'auto';
    }
    return mb_convert_encoding($title, 'UTF-8', $charset);
}

-1

PhpQuery ( ইউটিএফ -8 এর পরিবর্তে আইএসও -8859-1) নিয়ে আমার একই সমস্যা ছিল এবং এই হ্যাকটি আমাকে সহায়তা করেছিল:

$html = '<?xml version="1.0" encoding="UTF-8" ?>' . $html;

mb_internal_encoding('UTF-8'), phpQuery::newDocumentHTML($html, 'utf-8'), mbstring.internal_encodingএবং অন্যান্য হেরফেরের কোনো প্রভাব নেয়নি।


-1

'অটো' ছাড়া চেষ্টা করুন

এটাই:

mb_detect_encoding($text)

পরিবর্তে:

mb_detect_encoding($text, 'auto')

আরও তথ্য এখানে পাওয়া যাবে: mb_detect_encoding

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