PHP:استبدال علامات تغير في الصوت مع أقرب 7 بت ASCII ما يعادلها في UTF-8 سلسلة

StackOverflow https://stackoverflow.com/questions/158241

  •  03-07-2019
  •  | 
  •  

سؤال

ما أريد القيام به هو إزالة جميع لهجات علامات تغير في الصوت من سلسلة ، تحول "lärm" إلى "larm" أو "أندريه" في "أندريه".ما حاولت القيام به هو utf8_decode السلسلة ومن ثم استخدام strtr على ذلك ، ولكن منذ المصدر حفظ الملف كـ UTF-8 ملف لا أستطيع أن أدخل ISO-8859-15 حرفا لجميع علامات تغير في الصوت - محرر إدراج UTF-8 أحرف.

من الواضح أن حل هذا أن يكون هناك تدرج هذا هو ISO-8859-15 ملف, ولكن يجب أن يكون هناك طريقة أفضل من أخرى مطلوبة ؟

echo strtr(utf8_decode($input), 
           'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

تحديث: ربما كنت قليلا غير دقيقة مع ما أحاول القيام به:أنا في الواقع لا تريد إزالة علامات تغير في الصوت ، ولكن لتحل محلها مع أقرب "حرف واحد ASCII" ما يعادلها.

هل كانت مفيدة؟

المحلول

iconv("utf-8","ascii//TRANSLIT",$input);

مدد على سبيل المثال

نصائح أخرى

قليل الحيلة التي لا تتطلب تحديد أماكن أو وجود ضخمة جداول الترجمة:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}

الشرط الوحيد من أجل أن تعمل بشكل صحيح هو حفظ الملفات الخاصة بك في UTF-8 (كما يجب أن بالفعل).

يمكنك أيضا محاولة هذا

$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);

ولكن تحتاج إلى أن يكون http://php.net/manual/en/book.intl.php المتاحة

حسنا, وجدت حلا واضحا نفسي, لكنه ليس أفضل بشأن الأداء...

echo strtr(utf8_decode($input), 
           utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

العربية والفارسية المستخدمين أوصي هذه الطريقة لإزالة التشكيل:

    $diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
    $search_txt = str_replace($diacritics, '', $diacritics);

لكتابة التشكيل في اللغة العربية لوحة مفاتيح ش يمكن استخدام هذا Asci(تلك الرموز Asci لا Unicode) رموز في نظام التشغيل windows المحررين كتابة التشكيل مباشرة أو الضغط على Alt + (اكتب رمز من التشكيل حرف) هذه هي رموز

ـَ(0243) ـِ(0246) ـُ(0245) ـً(0240) ـٍ(0242) ـٌ(0241) ـْ(0250) ـّ(0248) ـ ـ(0220)

لقد وجدت أن هذا يعطي نتائج متسقة في الفرنسية و الألمانية.مع العلامة الوصفية تعيين utf-8, لدي وضعه في وظيفة للعودة خط من مجموعة من الكلمات و أنه يعمل بشكل مثالي.

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 

إذا كنت تستخدم وورد ، يمكنك استخدام المدمج في وظيفة remove_accents( $string )

https://codex.wordpress.org/Function_Reference/remove_accents

ومع ذلك لاحظت الخلل :أنها لا تعمل على سلسلة مع حرف واحد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top