FGETCSV () يتجاهل أحرف خاصة عندما تكون في بداية الخط!

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

  •  19-09-2019
  •  | 
  •  

سؤال

لدي برنامج نصي بسيط يقبل ملف CSV ويقرأ كل صف في صفيف. ثم أذهب إلى كل عمود من الصف الأول (في حالتي، فإنها تحمل أسئلة مسح) وأنا أطبعها. المسح باللغة الفرنسية وعندما يكون الطابع الأول للسؤال هو حرف خاص (é، ê، ç، etc) fgetcsv يغفله ببساطة.

لا تتأثر أحرف خاصة في منتصف القيمة إلا عندما تكون الشخصية الأولى.

حاولت تصحيح هذا لكنني حير. فعلت var_dump مع محتوى الملف والأحرف بالتأكيد:

var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));

وهنا رمز بلدي:

if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
    {
        $csv_arr = array();

        //Populate an array with all the cells of the CSV file
        while(!feof($csv))
        {
            $csv_arr[] = fgetcsv($csv);
        }

        //Close the file, no longer needed
        fclose($csv);

        // This should cycle through the cells of the first row (questions)
        foreach($csv_arr[0] as $question)
        {
            echo utf8_encode($question) . "<br />";
        }

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

المحلول

هل قمت بالفعل بالتحقق من صفحة يدوية على FGEDCSVب لا يوجد شيء يتحدث عن هذه المشكلات المحددة دفأة، ولكن هناك عدد من المساهمات ربما يستحق النظر من خلال إذا لم يتحقق شيء هنا.

هناك هذا، على سبيل المثال:

ملاحظة: يتم أخذ إعداد الإعدادات المحلية في الاعتبار بواسطة هذه الوظيفة. إذا كان Lang على سبيل المثال EN_US.UTF-8، تتم قراءة الملفات الموجودة في ترميز بايت واحد من خلال هذه الوظيفة.

أيضا، انظر كما هو الحال دائما في بداية الخط، هل يمكن أن يكون هذا هو حقا مشكلة مخفية خط كسر؟ هناك هذا:

ملاحظة: إذا كان PHP لا يتعرف بشكل صحيح على نهايات السطر عند قراءة الملفات إما أو تم إنشاؤها بواسطة كمبيوتر Macintosh، قد يساعد خيار تكوين وقت تشغيل Auto_Detect_Line_endings في حل المشكلة.

قد ترغب أيضا في تجربة حفظ الملف بنهايات سطر مختلفة.

نصائح أخرى

هل تحدد لغةك بشكل صحيح قبل الاتصال fgetcsv()?

setlocale(LC_ALL, 'fr_FR.UTF-8');

غير ذلك، fgetcsv() ليس متعدد البايت آمن.

تأكد من تعيينه على شيء يظهر في قائمة Loales المتاحة. على لينكس (بالتأكيد على دبيان) يمكنك أن ترى هذا من خلال القيام به

locale -a

يجب أن تحصل على شيء مثل ...

C
en_US.utf8
POSIX

بالنسبة لدعم UTF8، اختر ترميز مع UTF8 في النهاية. إذا تم ترميز إدخالك بشيء آخر، فستحتاج إلى استخدام اللغة المناسبة - ولكن تأكد من أن نظام التشغيل يدعمه أولا.

إذا قمت بتعيين اللغة إلى لغة غير متوفرة على نظامك فلن تساعدك.

هذا السلوك لديه تقرير الشوائب المقدمة لذلك، ولكن يبدو ذلك ليس خطأ.

رأينا نفس النتيجة LANG ضبط ل C, وعملت حولها عن طريق ضمان ملفوف هذه القيم في علامات الاقتباس. على سبيل المثال، الخط

a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"

يولد الصفيف التالي عند مر عبر fgetcsv():

array (
  0 => 'a',
  1 => 'a',
  2 => '',
  3 => 'é',
  4 => '',
  5 => 'óú',
  6 => '&ú',
  7 => 'ó&ú',
)

بالطبع، عليك أن تضطر إلى الهروب من أي علامات اقتباس في القيمة عن طريق مضاعفةها، ولكن هذا أقل من مشاحنات أقل من إصلاح الأحرف المفقودة.

الغريب، يحدث هذا مع ترميزات OUTF-8 و CP1252 لملف الإدخال.

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