سؤال

موقع ويب أكملته مؤخرًا مع صديق لديه معرض حيث يمكن للمرء تحميل الصور والملفات النصية. الملف النصي الوحيد المقبول (لتخفيف التطوير) هو .txt وعادة ما ينفجر بدون عقبة (أو لا ..)

المشكلات التي واجهتها هي نفس أي مطور: ASCII الممتد من Microsoft.

قبل إخراج النص من الملف ، تجاوزت عدة طبقات مختلفة لمحاولة تنظيفه:

$txtfile = file_get_contents(".".$this->var['submission']['file_loc']);

// BOM Fun
    $boms = array
    (
        "utf8"    => array(3,pack("CCC",0xEF,0xBB,0xBF)),
        "utf16be"       => array(2,pack("CC",0xFE,0xFF)),
        "utf16le"       => array(2,pack("CC",0xFF,0xFE)),
        "utf32be"       => array(4,pack("CCCC",0x00,0x00,0xFE,0xFF)),
        "utf32le"       => array(4,pack("CCCC",0xFF,0xFE,0x00,0x00)),
        "gb18030"       => array(4,pack("CCCC",0x84,0x31,0x95,0x33))
    );
    foreach($boms as $bom)
    {
        if(mb_substr($txtfile,0,$bom[0]) == $bom[1])
        {
            $txtfile = substr($txtfile,$bom[0]);
            break;
        }
    }
$txtfile_o = $txtfile;
$badwords = array(chr(145),chr(146),chr(147),chr(148),chr(151),chr(133));
$fixwords = array("'","'",'"','"','-','...');
$txtfile_o = str_replace($badwords,$fixwords,$txtfile_o);
$txtfile_o = mb_convert_encoding($txtfile_o,"UTF-8");

str_replace هي الطريقة العامة لتحويل اقتباسات Microsoft Smart Smart و EM-Dash و Ellipsis إلى معادلات ASCII العادية للإخراج.

يعمل هذا الرمز بشكل مثالي في ظل الشرط الذي تم تحميله هو ANSI / US-ASCII.

لا يعمل هذا الرمز (بدون سبب معين) عندما يكون الملف الذي تم تحميله UTF-8.

عندما يكون الملف UTF-8 ، فإن عرض الملف نفسه في متصفح الويب يعمل بشكل جيد ، لكن طباعته عبر واجهة الويب باستخدام هذا الرمز لا. في هذا الحدث ، أصبحت الاقتباسات الذكية نوعًا ما من الشخصية.

هذا هو المكان الذي عالق. إن ترميز الإخراج لصفحة الويب هو UTF-8 ، يرى متصفح الويب أنه UTF-8 ، والملف موجود في UTF-8 ، ومع ذلك لا يعمل الاستبدال لـ Smart Quotes ولا يعرض متصفح الويب بشكل صحيح.

أي وجميع المساعدة في هذا سيكون موضع تقدير كبير.

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

المحلول

إذا فهمت مشكلتك بشكل صحيح هي أن التعليمات البرمجية التي تحل محل أحرف "ASCII الموسعة" لنظيرات ASCII الخاصة بهم تفشل عندما يقدم المستخدم ملفًا في UTF-8.

هذا كان متوقعا. لا يمكنك العمل على ملفات UTF-8 str_replace وما شابه ذلك ، والذي يعمل على مستوى البايت ، في حين أن الحرف في UTF-8 يتكون من بايت واحد فقط للشخصيات في نطاق ASCII.

ما أوصيك به هو استخدام بعض الإرشادات لتحديد ما إذا كان الملف مشفرًا في UTF-8 (BOM طريقة جيدة إذا كنت متأكدًا من أنه سيكون موجودًا) أو Windows-1252 أو أي شيء آخر. تحويله إلى UTF-8 إذا لم يكن كذلك. في هذه الحالة ، لن تحتاج إلى استبدال أي أحرف ، يمكنك الحفاظ على عروض الأسعار الذكية.

نصائح أخرى

الأحرف التي تحاول استبدالها لها قيم بايت مختلفة في UTF8. في الواقع ، لديهم أكثر من بايت واحد في UTF8. أنت تحاول البحث عنها بقيم ترميز Windows ولهذا السبب لن تجدها.

ابحث عن تسلسل Byte UTF8 للأحرف واستخدمها للبحث.

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