خطأ في الاستيراد من النسخة الأصلية: تسلسل بايت غير صالح في UTF-8

أحاول استيراد بيانات من منتدى Vanilla باستخدام التعليمات المنشورة هنا. ومع ذلك، أواجه الخطأ التالي عند تشغيل سكريبت الاستيراد vanilla.rb:

Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
parsing file...
reading file...
Traceback (most recent call last):
	5: from script/import_scripts/vanilla.rb:254:in `<main>'
	4: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
	3: from script/import_scripts/vanilla.rb:17:in `execute'
	2: from script/import_scripts/vanilla.rb:37:in `parse_file'
	1: from script/import_scripts/vanilla.rb:72:in `read_file'
script/import_scripts/vanilla.rb:72:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)

لقد جربت تغيير مجموعة أحرف قاعدة بيانات MySQL إلى UTF8 وفقًا للتعليمات الموجودة هنا ثم إعادة تصدير ملف التصدير، لكن ذلك لم يحل المشكلة. هل لديكم أي اقتراحات؟

You either need to keep trying to get it to really be UTF-8 or modify the import script to do it. It is a frustrating problem.

@dpkoch هل تمكنت من حل هذه المشكلة؟

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

يبدو الأمر فظيعًا… سنضطر إلى تعديل ترميز الجدول ونرى ما سيحدث. شكرًا لك!

أوه، الأمر فظيع. أفضل رهان لك، بناءً على ذكرى ضبابية عن مرة واحدة قمتُ بها قبل أكثر من عام، هو تجربة أكبر عدد ممكن من التحويلات المختلفة حتى تجد أخيرًا واحدة تعمل مع جميع البيانات أو معظمها. أعتقد أنني قمتُ بعدة تحويلات فردية تبين أنها إضاعة للوقت عندما اعترتني صدفةً تحويل يعمل مع جميع (معظم؟) البيانات.

إليك ما فعلته. استخدمها على مسؤوليتك الخاصة. (كان هذا vbulletin، مجرد معلومة جانبية).

  def char_map(raw_original)
    raw = raw_original.dup
    debug = false # (raw.length > 50)

    # windows 1252
    all = ''
    win_encoded = ''

    ### WIN1252 encoding
    win_encoded = ''
    begin
      win_encoded = raw.force_encoding('utf-8').encode("Windows-1252",
                            invalid: :replace, undef: :replace, replace: ""
                           ).force_encoding('utf-8').scrub
    rescue => e
      puts "\n#{'-'*50}\nWin1252 failed for \n\n#{raw}\n\n"
      win_encoded = ''
    end

    ### ISO 8859 encoding
    iso_encoded = ''
    if all.length == 0 && win_encoded.length > 0 && win_encoded != raw
      all = (debug ? "Win1252--" : '') + win_encoded
    else
      all = raw
    end
    all = old_char_map(all)
    all
  end

يتم استخدام هذا الكود داخل سكريبت الاستيراد أم على جانب الخادم/قاعدة البيانات؟

في سكريبت الاستيراد. لا أحب التدخل في قاعدة البيانات.

في مكان ما تستدعي هذه الدالة على raw لإصلاح raw (وربما العناوين؟).

حسنًا، شكرًا جزيلاً! هذا يجب أن يمنحني بداية قوية في تصحيح هذا.

لقد نجحنا في ذلك بإضافة أمر بسيط لتشفير الملف بصيغة UTF-8 أثناء قراءته، باستخدام شيء مثل encode\"UTF-8\" في الأسطر 76-80 من نص الاستيراد vanilla.rb.

أنا فقط أنتظر تأكيدًا على الصيغة الدقيقة من الشخص الذي قام بذلك عبر سطر الأوامر. سأقوم بالتحديث عندما أحصل عليها.

إليك ما استخدمه لإصلاح هذا، بدءًا من السطر 76 من vanilla.rb

def read_file
  puts "reading file..."
  string = [File.read](http://file.read/)(@vanilla_file)
    .force_encoding('UTF-8').encode("UTF-8").gsub("\\N", "")
    .force_encoding('UTF-8').encode("UTF-8").gsub(/\\$\\n/m, "\\n")
    .force_encoding('UTF-8').encode("UTF-8").gsub("\\,", ",")
    .force_encoding('UTF-8').encode("UTF-8").gsub(/(?<!\\)\\"/, '""')
    .force_encoding('UTF-8').encode("UTF-8").gsub(/\\\\\\\\\\"/, '\\\"\"')
  [StringIO.new](http://stringio.new/)(string)
end

هذا لا يعمل. نفس الخطأ.

تحتاج إلى البحث في جوجل عن الترميز ومعرفة كيفية إصلاح الترميز المعطل لديك.

مرحباً @ddeveloper،

لقد مررت بهذه العملية قبل شهرين فقط (وأنا لست مطورًا :slightly_smiling_face:) وتمكنت من ترحيل منتدى Vanilla مستضاف ذاتيًا بنجاح إلى Discourse مستضاف ذاتيًا. كان أحد الأشياء الرئيسية بالنسبة لي هو التأكد عند تصدير البيانات باستخدام Vanilla Porter، من تحديد “Vanilla 2” كـ Source Forum Type في القائمة المنسدلة الأولى.

لقد استخدمت الإصدار Vanilla Porter 2.6 المتاح للتنزيل كملف مضغوط هنا: Vanilla Porter 2.6 RC1 — Vanilla Forums بدلاً من الإصدار 2.5 المرتبط في Migrate a Vanilla forum to Discourse.

إذا كنت أتذكر بشكل صحيح، لم أواجه خطأ UTF-8 مرة أخرى عند استخدام نص Vanilla Porter الأحدث ونوع المنتدى “Vanilla 2”.

إذا لم تحدث هذين الاقتراحين فرقًا في استيرادك، فيرجى تقديم بعض التفاصيل حول الخطوات التي اتخذتها حتى الآن وما تراه بالضبط. في بعض الأحيان تكون هناك اختلافات طفيفة في “نفس الخطأ” يمكن أن تحدث فرقًا كبيرًا عند استكشاف الأخطاء وإصلاحها.

لقد اتبعت نفس الدليل باستثناء استخدام إصدار porter 2.6. سأقوم بتصدير الملف من الإصدار 2.6 وأقوم بالتحديث هنا.

حسنًا، لقد جربت porter 2.6 وأدى ذلك إلى نفس خطأ UTF-8:

حتى الآن، اتبعت هذا الدليل: Migrate a Vanilla forum to Discourse

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

لقد جربت حل @Nick_Chomey أعلاه؛ محاولة فرض ترميز utf-8 أثناء قراءة ملف txt ولكن للأسف لم ينجح ذلك أيضًا.

فقط للتأكد، ما هو نوع المنتدى المصدر الذي حددته في القائمة المنسدلة لـ Vanilla Porter؟

هل يمكنك إخبارنا بنوع الكمبيوتر الذي تستخدمه؟ ستختلف التعليمات لتحويل ملفك إلى ترميز UTF-8.

شكراً لوقتك في مساعدة زميل في المنتدى.

لقد اخترت “Vanilla 2” في Source Forum Type.

يمكنني استخدام أجهزة تعمل بنظامي التشغيل Windows و Linux ولدي وصول إلى كليهما.