স্ট্রিং থেকে নন- utf8 টি অক্ষর সরান


112

স্ট্রিং থেকে নন- utf8 অক্ষর অপসারণ করতে আমার সমস্যা হচ্ছে, যা সঠিকভাবে প্রদর্শিত হচ্ছে না। অক্ষরগুলি 0x97 0x61 0x6C 0x6F (হেক্স প্রতিনিধিত্ব) এর মতো

এগুলি সরানোর সর্বোত্তম উপায় কী? নিয়মিত অভিব্যক্তি নাকি অন্য কিছু?


1
এখানে তালিকাবদ্ধ সমাধানগুলি আমার পক্ষে কার্যকর হয়নি তাই আমি এখানে আমার উত্তরটি "চরিত্রের বৈধতা" বিভাগে পেয়েছি
bobef

এটি সম্পর্কিত , তবে সম্ভবত খুব কাছের চাচাত ভাইয়ের মতো নকল নয় :)
ওয়েইন ওয়েবেল

উত্তর:


87

একটি রেজেক্স পদ্ধতির ব্যবহার:

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);

এটি ইউটিএফ -8 সিকোয়েন্সগুলির সন্ধান করে এবং এগুলিকে 1 টি গ্রুপে বন্দী করে It প্রতিস্থাপন হ'ল যা 1 গ্রুপে ধরা পড়েছিল এটি কার্যকরভাবে সমস্ত অবৈধ বাইটগুলি সরিয়ে দেয়।

অবৈধ বাইটগুলি ইউটিএফ -8 অক্ষর হিসাবে এনকোড করে স্ট্রিংটি মেরামত করা সম্ভব। তবে ত্রুটিগুলি এলোমেলো হলে এটি কিছু অদ্ভুত প্রতীক ছেড়ে দিতে পারে।

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]               # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]    # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                      # ...one or more times
  )
| ( [\x80-\xBF] )                 # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] )                 # invalid byte in range 11000000 - 11111111
/x
END;
function utf8replacer($captures) {
  if ($captures[1] != "") {
    // Valid byte sequence. Return unmodified.
    return $captures[1];
  }
  elseif ($captures[2] != "") {
    // Invalid byte of the form 10xxxxxx.
    // Encode as 11000010 10xxxxxx.
    return "\xC2".$captures[2];
  }
  else {
    // Invalid byte of the form 11xxxxxx.
    // Encode as 11000011 10xxxxxx.
    return "\xC3".chr(ord($captures[3])-64);
  }
}
preg_replace_callback($regex, "utf8replacer", $text);

সম্পাদনা করুন:

  • !empty(x)খালি শূন্য মানের সাথে মিলবে ( "0"খালি বিবেচিত)।
  • x != ""সহ খালি শূন্য মানের সাথে মিলবে "0"
  • x !== ""বাদে কিছু মিলবে ""

x != "" এই ক্ষেত্রে ব্যবহার করা সবচেয়ে ভাল বলে মনে হচ্ছে।

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


$regex = <<<'END'পিএইচপি <5.3.x এর পরিবর্তে কী ব্যবহার করবেন?
serhio

আপনি এটিকে পরিবর্তনের জন্য সামান্য জরিমানার পরিবর্তে হেরডোক ফর্ম্যাটে রূপান্তর করতে পারেন। আর একটি সম্ভাবনা হ'ল একক-উদ্ধৃতি স্ট্রিংগুলি ব্যবহার করা, তবে তারপরে আপনাকে মন্তব্যগুলি সরিয়ে ফেলতে হবে।
মার্কাস জারদারোট

এই লাইনে একটি ছোট টাইপ রয়েছে elseif (!empty($captures([2])) {এবং !== ""খালি "0"বিবেচনা করার কারণে আপনার খালি পরিবর্তে ব্যবহার করা উচিত । এছাড়াও এই ফাংশনটি খুব ধীর, এটি কি আরও দ্রুত করা যায়?
কেন্ডাল হপকিন্স

2
এই অভিব্যক্তিটির প্রধান স্মৃতি সমস্যা রয়েছে, এখানে দেখুন
জ্যাক

1
@ মারকাসজার্ডোট, রেজেক্স ....... হুম, এই ফাংশনটি কি প্রস্তুত? এই ফাংশন জন্য পরীক্ষা আছে?
পেসারিয়ার

132

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

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

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

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

ব্যবহার:

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

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

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

আমি অন্য একটি ক্রিয়াকলাপ, এনকোডিং :: ফিক্সটএফ 8 () অন্তর্ভুক্ত করেছি, যা প্রতিটি ইউটিএফ 8 স্ট্রিং স্থির করবে যা একাধিকবার ইউটিএফ 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

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

https://github.com/neitanod/forceutf8


13
অসামান্য স্টাফ! অন্যান্য সমস্ত সমাধান অবৈধ অক্ষরগুলি বাতিল করে, তবে এটি এটি ঠিক করে দেয়। অসাধারণ.
giorgio79

4
আপনি দুর্দান্ত ফাংশন করেছেন! আমি অতীতে এক্সএমএল ফিডগুলির সাথে অনেক কাজ করেছি এবং সর্বদা এনকোডিংয়ের সাথে সমস্যা ছিল। ধন্যবাদ.
Kostanos

5
আমি তোমায় ভালোবাসি. আপনি আমাকে খারাপ ইউটিএফ 8 চরগুলিতে HOURS "ব্লুমমাইন" কাজ সংরক্ষণ করেছেন। ধন্যবাদ।
জন বলিঞ্জার

4
এটি চমৎকার. আপনাকে ধন্যবাদ
এজক্যাসবার্গ

2
আশ্চর্য, খুব ভাল! আমি খুজে পেয়েছি আমি চাই আমি +100 ;-) দিয়ে ভোট দিতে পারতাম
কোডবিট

61

আপনি এমবিস্ট্রিং ব্যবহার করতে পারেন:

$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');

... অবৈধ অক্ষর মুছে ফেলবে।

দেখুন: প্রশ্ন চিহ্ন দ্বারা অবৈধ ইউটিএফ -8 অক্ষর প্রতিস্থাপন, এমবিস্ট্রিং.সুবিস্টিউট_চার্যাক্টর উপেক্ষা করা হয়েছে বলে মনে হচ্ছে


1
@ এ্যালিসওয়েল কোনটি? আপনি একটি উদাহরণ প্রদান করতে পারেন?
ফ্রস্টি জেড

নিশ্চিত,<0x1a>
অলিসওয়েল

1
@ অ্যালিসওয়েল যদি আমার ভুল <0x1a>না হয় তবে মুদ্রণযোগ্য চরিত্র না হলেও এটি পুরোপুরি বৈধ ইউটিএফ -8 সিকোয়েন্স। প্রিন্টযোগ্য অক্ষরগুলি নিয়ে আপনার সমস্যা থাকতে পারে? এটি দেখুন: স্ট্যাকওভারফ্লো.com
ফ্রস্টি জেড

হ্যাঁ, এটা কেস। ধন্যবাদ বন্ধু!
অ্যালিসওয়েল

এমবি রূপান্তর কল করার আগে, আমাকে এমবিস্ট্রিং বিকল্প চরিত্রটি কারও কাছে সেট করতে হবে ini_set('mbstring.substitute_character', 'none');অন্যথায় আমি ফলাফলের প্রশ্ন চিহ্ন পাচ্ছিলাম।
cby016

21

এই ফাংশনটি সমস্ত NON ASCII অক্ষর সরিয়ে দেয়, এটি দরকারী তবে প্রশ্নটি সমাধান করছে না:
এটি আমার কাজ যা সর্বদা কাজ করে, নির্বিশেষে এনকোডিং:

function remove_bs($Str) {  
  $StrArr = str_split($Str); $NewStr = '';
  foreach ($StrArr as $Char) {    
    $CharNo = ord($Char);
    if ($CharNo == 163) { $NewStr .= $Char; continue; } // keep £ 
    if ($CharNo > 31 && $CharNo < 127) {
      $NewStr .= $Char;    
    }
  }  
  return $NewStr;
}

কিভাবে এটা কাজ করে:

echo remove_bs('Hello õhowå åare youÆ?'); // Hello how are you?

8
সমস্ত ক্যাপ কেন ফাংশন নাম? Ewww।
ক্রিস বেকার

5
এটি ASCII এবং প্রশ্নটি কী চেয়েছিল তার কাছাকাছিও নয়।
মিস্যাক্সি

1
এই এক কাজ। আমি যখন গুগল ম্যাপস এপিআই অনুরোধ URL এ 'ইউটিএফ -8 অক্ষরবিহীন' কারণে ত্রুটিটি রিপোর্ট করেছিল তখন আমি সমস্যার মুখোমুখি হয়েছি। অপরাধী íঠিকানা ক্ষেত্রের চরিত্র ছিল যা একটি বৈধ UTF-8 অক্ষর দেখুন সারণী । মনোবল: এপিআই ত্রুটি বার্তাগুলিতে বিশ্বাস করবেন না :)
ভ্যালেন্টাইন শি

17
$text = iconv("UTF-8", "UTF-8//IGNORE", $text);

এই আমি ব্যবহার করছি। চমত্কার কাজ মনে হয়। Http://planetozh.com/blog/2005/01/remove-in अवैध- characters- in- utf-8/ থেকে নেওয়া হয়েছে


আমার জন্য কাজ করেনি। আমি আশা করি আমি পরীক্ষিত লাইনটি সংযুক্ত করতে পারতাম তবে দুর্ভাগ্যক্রমে এটিতে অবৈধ অক্ষর রয়েছে।
নীর ও।

3
দুঃখিত, আরও কিছু পরীক্ষার পরে আমি বুঝতে পেরেছিলাম যে এটি আমার যা মনে হয়েছিল তা সত্যই ঘটছে না। আমি এখন ব্যবহার করছি stackoverflow.com/a/8215387/138023
Znarkus

14

এটা চেষ্টা কর:

$string = iconv("UTF-8","UTF-8//IGNORE",$string);

আইকনভ ম্যানুয়াল অনুসারে , ফাংশনটি প্রথম প্যারামিটারটিকে ইনপুট চরসেট হিসাবে, দ্বিতীয় প্যারামিটারটিকে আউটপুট চরসেট হিসাবে এবং তৃতীয়টি প্রকৃত ইনপুট স্ট্রিং হিসাবে গ্রহণ করবে।

আপনি উভয় ইনপুট এবং আউটপুট অক্ষরসেট সেট করেন তাহলে হল UTF-8 , এবং সংযুক্ত //IGNOREআউটপুট অক্ষরসেট পতাকা, ফাংশন (ফালা) ইনপুট স্ট্রিং সব কিছু অক্ষর আছে যা আউটপুট অক্ষরসেট দ্বারা প্রতিনিধিত্ব করা যাবে না পতিত হবে। সুতরাং, কার্যকর ইনপুট স্ট্রিং ফিল্টারিং।


কোড স্নিপেট ডাম্প করার চেয়ে আপনার উত্তরটি কী করে তা ব্যাখ্যা করুন।
টমাসজ কোয়ালকিজেক

3
আমি এটি চেষ্টা করে দেখেছি এবং //IGNOREঅবৈধ ইউটিএফ -8 উপস্থিত নোটিশটি দমন করছে বলে মনে হচ্ছে না (যা অবশ্যই, আমি জানি এবং এটি ঠিক করতে চাই)। ম্যানুয়ালটিতে একটি উচ্চ রেট দেওয়া মন্তব্য মনে হচ্ছে এটি কয়েক বছর ধরে একটি বাগ হয়েছে।
অর্ধেক

ব্যবহার করা সর্বদা ভাল iconv। @ হাইফার সম্ভবত আপনার ইনপুট ডেটা utf-8 থেকে নয়। আরেকটি বিকল্প হ'ল আসকিটিতে পুনরায় রূপান্তর করা এবং তারপরে আবার ইউটিএফ -8 এ ফিরে আসা। আমার ক্ষেত্রে আমি ব্যবহার হয়নি iconvমত$output = iconv("UTF-8//", "ISO-8859-1//IGNORE", $input );
m3nda

@ erm3nda: আমি এর জন্য আমার ব্যবহারের কেসটি ঠিক মনে করি না - একটি ইউটিএফ -8 ওয়েবসাইটকে ভুল অক্ষর দ্বারা ঘোষিত হতে পারে। নোটটির জন্য ধন্যবাদ, আমি নিশ্চিত যে এটি ভবিষ্যতের পাঠকের পক্ষে কার্যকর হবে।
অর্ধ

হ্যাঁ, আপনি যদি কিছু না জানেন তবে কেবল এটির জন্য পরীক্ষা করুন এবং শেষ পর্যন্ত আপনি কীটি টিপুন ;-)
m3nda


6

ইউকনভার্টার পিএইচপি 5.5 থেকে ব্যবহার করা যেতে পারে। আপনি যদি ইন্টেল এক্সটেনশন ব্যবহার করেন এবং এমবিস্ট্রিং না ব্যবহার করেন তবে ইউকনভার্টারটি আরও ভাল পছন্দ।

function replace_invalid_byte_sequence($str)
{
    return UConverter::transcode($str, 'UTF-8', 'UTF-8');
}

function replace_invalid_byte_sequence2($str)
{
    return (new UConverter('UTF-8', 'UTF-8'))->convert($str);
}

এইচটিএমএল স্পেশালচার্স পিএইচপি 5.4 থেকে অবৈধ বাইট ক্রম অপসারণ করতে ব্যবহার করা যেতে পারে। বৃহত আকারের বাইট এবং যথার্থতা পরিচালনা করার জন্য এইচটিএমএল স্পেশালচার্স প্রিগ_ম্যাচের চেয়ে ভাল is নিয়মিত এক্সপ্রেশন ব্যবহার করে অনেকগুলি ভুল বাস্তবায়ন দেখা যায়।

function replace_invalid_byte_sequence3($str)
{
    return htmlspecialchars_decode(htmlspecialchars($str, ENT_SUBSTITUTE, 'UTF-8'));
}

আপনার কাছে তিনটি দুর্দান্ত সমাধান রয়েছে তবে কোনও ব্যবহারকারী তাদের মধ্যে কীভাবে চয়ন করবেন তা পরিষ্কার নয়।
বব রে

6

আমি একটি ফাংশন তৈরি করেছি যা কোনও স্ট্রিং থেকে অবৈধ UTF-8 অক্ষর মুছে দেয়। এক্সএমএল এক্সপোর্ট ফাইল উত্পন্ন করার আগে আমি 27000 পণ্যগুলির বিবরণ সাফ করতে এটি ব্যবহার করছি।

public function stripInvalidXml($value) {
    $ret = "";
    $current;
    if (empty($value)) {
        return $ret;
    }
    $length = strlen($value);
    for ($i=0; $i < $length; $i++) {
        $current = ord($value{$i});
        if (($current == 0x9) || ($current == 0xA) || ($current == 0xD) || (($current >= 0x20) && ($current <= 0xD7FF)) || (($current >= 0xE000) && ($current <= 0xFFFD)) || (($current >= 0x10000) && ($current <= 0x10FFFF))) {
                $ret .= chr($current);
        }
        else {
            $ret .= "";
        }
    }
    return $ret;
}

উপরের সমস্ত জটিল উত্তরগুলির মধ্যে, এইটি আমার জন্য কৌশলটি করেছে! ধন্যবাদ।
এমিন Özlem

আমি এই ফাংশন দ্বারা বিভ্রান্ত। ord()0-255 সীমাতে ফলাফল দেয়। ifএই ফাংশনটির দৈত্যটি ইউনিকোড ব্যাপ্তির জন্য পরীক্ষা করে যা ord()কখনই ফিরে আসবে না। এই ফাংশনটি কেন এমনভাবে কাজ করে তা যদি কেউ ব্যাখ্যা করতে চান তবে আমি অন্তর্দৃষ্টিটির প্রশংসা করব।
i336_

4

2019 এ স্বাগতম /uএবং রেজেজেমে সংশোধক যা আপনার জন্য ইউটিএফ -8 মাল্টিবাইট চরগুলি পরিচালনা করবে

আপনি যদি কেবলমাত্র ব্যবহার করেন তবেই mb_convert_encoding($value, 'UTF-8', 'UTF-8')আপনার স্ট্রিং-এ প্রিন্টযোগ্য অক্ষরগুলি শেষ হবে

এই পদ্ধতিটি করবে:

  • সমস্ত অবৈধ ইউটিএফ -8 মাল্টিবাইট চরগুলি দিয়ে মুছে ফেলুন mb_convert_encoding
  • মুদ্রণযোগ্য সমস্ত অক্ষর যেমন \r, \x00(NULL-বাইট) এবং অন্যান্য নিয়ন্ত্রণ অক্ষর মুছুনpreg_replace

পদ্ধতি:

function utf8_filter(string $value): string{
    return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}

[:print:]সমস্ত মুদ্রণযোগ্য অক্ষর এবং \nনিউলাইনগুলিকে মেলে এবং অন্য কিছু ছড়িয়ে দিন

আপনি নীচে ASCII টেবিলটি দেখতে পাচ্ছেন .. মুদ্রণযোগ্য চরগুলি 32 থেকে 127 অবধি \nরয়েছে , তবে নিউলাইনটি নিয়ন্ত্রণ বর্ণগুলির একটি অংশ যা 0 থেকে 31 এর মধ্যে রয়েছে তাই আমাদের রেজিজে নতুন লাইনের যোগ করতে হবে/[^[:print:]\n]/u

https://cdn.shopify.com/s/files/1/1014/5789/files/Standard-ASCII-Table_large.jpg?10669400161723642407

আপনি \x7F(ডেল), \x1B(ইস্ক) ইত্যাদির মুদ্রণযোগ্য ব্যাপ্তির বাইরে চরগুলি দিয়ে রেজেক্সের মাধ্যমে স্ট্রিংগুলি প্রেরণের চেষ্টা করতে পারেন এবং দেখুন যে তারা কীভাবে ছাঁটা হয়েছে

function utf8_filter(string $value): string{
    return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}

$arr = [
    'Danish chars'          => 'Hello from Denmark with æøå',
    'Non-printable chars'   => "\x7FHello with invalid chars\r \x00"
];

foreach($arr as $k => $v){
    echo "$k:\n---------\n";
    
    $len = strlen($v);
    echo "$v\n(".$len.")\n";
    
    $strip = utf8_decode(utf8_filter(utf8_encode($v)));
    $strip_len = strlen($strip);
    echo $strip."\n(".$strip_len.")\n\n";
    
    echo "Chars removed: ".($len - $strip_len)."\n\n\n";
}

https://www.tehplayground.com/q5sJ3FOddhv1atpR


2047 এ স্বাগতম, যেখানে php-mbstringপিএইচপি তে ডিফল্টরূপে প্যাক হয় না।
এনভিআরএম


2

সাম্প্রতিক প্যাচ থেকে দ্রুপালের ফিডস জেএসএন পার্সার মডিউল:

//remove everything except valid letters (from any language)
$raw = preg_replace('/(?:\\\\u[\pL\p{Zs}])+/', '', $raw);

যদি আপনি হ্যাঁ উদ্বিগ্ন হন তবে এটি ফাঁকা স্থানগুলিকে বৈধ অক্ষর হিসাবে ধরে রাখে।

আমার যা প্রয়োজন ছিল তা করলাম। এটি আজকাল বিস্তৃত ইমোজি-অক্ষরগুলি সরিয়ে দেয় যা মাইএসকিউএল এর 'ইউটিএফ 8' অক্ষর সেটটিতে ফিট করে না এবং এটি আমাকে "এসকিউএলসেট [এইচওয়াই 1000] এর মতো ত্রুটি দিয়েছে: সাধারণ ত্রুটি: 1366 ভুল স্ট্রিংয়ের মান"।

বিস্তারিত জানার জন্য https://www.drupal.org/node/1824506#comment-6881382 দেখুন


iconvএ পর্যন্ত পুরানো ঢঙের regexp ভিত্তিক বেশী ভালো preg_replace, কোনটা আজকাল অসমর্থিত হয়েছে।
এম


1
আপনি পুরোপুরি ঠিক বলেছেন ereg_replace(), দুঃখিত।
এম 3 এন্ড

2

সম্ভবত সবচেয়ে সুনির্দিষ্ট সমাধান না হলেও এটি কোডের একক লাইন দিয়ে কাজটি সম্পন্ন করে:

echo str_replace("?","",(utf8_decode($str)));

utf8_decodeঅক্ষরগুলি একটি প্রশ্ন চিহ্নে রূপান্তরিত করবে;
str_replaceপ্রশ্ন চিহ্নগুলি ছাঁটাই করবে।


কয়েকশো সমাধানের চেষ্টা করার পরে, একমাত্র সমাধান যা এটি আপনার কাজ করেছিল।
হরিসিংহ গোহিল

1

সুতরাং নিয়মগুলি হ'ল প্রথম ইউটিএফ -8 অক্টলেটটিতে একটি মার্কার হিসাবে উচ্চ বিট সেট থাকে এবং তারপরে আরও কতগুলি অক্টলেট নির্দেশ করে 1 থেকে 4 বিট করে; তারপরে অতিরিক্ত অটলেটগুলির প্রত্যেকের উচ্চতর দুটি বিট 10 এ সেট করা থাকতে হবে।

সিউডো-পাইথন হ'ল:

newstring = ''
cont = 0
for each ch in string:
  if cont:
    if (ch >> 6) != 2: # high 2 bits are 10
      # do whatever, e.g. skip it, or skip whole point, or?
    else:
      # acceptable continuation of multi-octlet char
      newstring += ch
    cont -= 1
  else:
    if (ch >> 7): # high bit set?
      c = (ch << 1) # strip the high bit marker
      while (c & 1): # while the high bit indicates another octlet
        c <<= 1
        cont += 1
        if cont > 4:
           # more than 4 octels not allowed; cope with error
      if !cont:
        # illegal, do something sensible
      newstring += ch # or whatever
if cont:
  # last utf-8 was not terminated, cope

এই একই যুক্তি পিএইচপি করার জন্য অনুবাদযোগ্য হওয়া উচিত। তবে, আপনি কোনও ত্রুটিযুক্ত চরিত্রটি পেয়ে গেলে কী ধরণের স্ট্রিপিং করা উচিত তা পরিষ্কার নয়।


c = (ch << 1)(c & 1)লুপটি এড়িয়ে প্রথমবারের মতো শূন্য করবে । পরীক্ষাটি সম্ভবত হওয়া উচিত(c & 128)
মার্কাস জারাদারোট


0

প্রশ্নের তুলনায় কিছুটা আলাদা, তবে আমি যা করছি তা হল এইচটিএমএল এনকোড (স্ট্রিং) ব্যবহার করা,

সিউডো কোড এখানে

var encoded = HtmlEncode(string);
encoded = Regex.Replace(encoded, "&#\d+?;", "");
var result = HtmlDecode(encoded);

ইনপুট এবং আউটপুট

"Headlight\x007E Bracket, &#123; Cafe Racer<> Style, Stainless Steel 中文呢?"
"Headlight~ Bracket, &#123; Cafe Racer<> Style, Stainless Steel 中文呢?"

আমি জানি এটি নিখুঁত নয়, তবে আমার জন্য কাজটি করে।


0
static $preg = <<<'END'
%(
[\x09\x0A\x0D\x20-\x7E]
| [\xC2-\xDF][\x80-\xBF]
| \xE0[\xA0-\xBF][\x80-\xBF]
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| \xF0[\x90-\xBF][\x80-\xBF]{2}
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)%xs
END;
if (preg_match_all($preg, $string, $match)) {
    $string = implode('', $match[0]);
} else {
    $string = '';
}

এটি আমাদের পরিষেবাতে কাজ করে


2
কোড-কেবলমাত্র উত্তরের পরিবর্তে এটি কীভাবে প্রশ্নের উত্তর দেবে তা বোঝাতে আপনি কিছু প্রসঙ্গ যুক্ত করতে পারেন?
অরুণ বিনোথ

-1

আইকনভি সম্পর্কে কীভাবে:

http://php.net/manual/en/function.iconv.php

এটি পিএইচপি নিজেই ব্যবহার করে নি তবে এটি সর্বদা আমার পক্ষে কমান্ড লাইনে ভাল সম্পাদন করেছে। আপনি এটি অবৈধ অক্ষরগুলির বিকল্প হিসাবে পেতে পারেন।

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