سؤال

لقد أنشأت webapi التي تُرجع JSON.

البيانات الأولية هي كما يتبع (UTF-8 مشفر):

@text="Rosenborg har ikke h\xC3\xB8rt hva Steffen"

ثم مع. to_json على كائني ، إليك ما يتم إرساله بواسطة واجهة برمجة التطبيقات (أعتقد أنه ترميز ISO-8859-1):

"text":"Rosenborg har ikke h\ufffd\ufffdrt hva Steffen"

أنا أستخدم httparty على جانب العميل ، وهذا ما أحصل عليه أخيرًا:

"text":"Rosenborg har ikke h��rt hva"

يستخدم كل من تطبيق WebAPI و Client Ruby 1.9.2 و Rails 3.

لقد فقدت بعض الشيء مع مشكلة الترميز هذه ... حاولت إضافة رأس ترميز UTF8 إلى ملفات Ruby الخاصة بي ، لكنه لم يغير أي شيء. أعتقد أنني أفتقد جزء ترميز / فك تشفير في مكان ما ... أي شخص لديه فكرة؟

شكرا جزيلا لك !!! فنسنت

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

المحلول

في Ruby 1.9 ، الترميز واضح الآن. ومع ذلك ، قد يتم أو لا يتم تكوين القضبان لإرسال الردود في الترميز الذي تتوقعه. سيكون عليك تعيين إعداد التكوين العالمي:

Encoding.default_external = "utf-8".

أعتقد أن الترميز الذي يحدده روبي افتراضيًا للتسلسل هو الافتراضي للمنصة. في أمريكا على Windows التي ستكون codepage-1251. الدول الأخرى سيكون لها تشفير بديل.

يحرر: انظر أيضًا عنوان URL هذا إذا تم تنفيذ JSON ضد MySQL: https://rails.lighthouseapp.com/projects/8994/tickets/5210-encoding-problem-in-json-format-reSponse

تحرير 2: سيحترم Rails Core ومجموعة من المكتبات (ActivereCord ، et. لسوء الحظ ، نظرًا لأن الترميز هو مفهوم جديد نسبيًا لروبي وليس كل مكتبة طرف ثالثة تم تعديلها للتشفير المناسب. تلك التي قد تتطلب إعدادات تكوين إضافية لتلك المكتبات. ويشمل ذلك MySQL ، ومكتبة RSOLR التي كنت تستخدمها.

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

ال Encoding.force_encoding تم تصميم الطريقة لعلاج تسلسل البايت مع هذا الترميز الجديد ، ولكنه لا يغير أيًا من البيانات الأساسية. لذلك من الممكن أن يكون لديك تسلسل بايت غير صالح. هناك طريقة أخرى تسمى .encode() سيؤدي ذلك إلى تحويل البايتات من ترميز إلى آخر ويضمن تسلسل بايت صالح. لمزيد من المعلومات ، اقرأ هذا:

http://blog.grayproductions.net/articles/ruby_19s_string

نصائح أخرى

حسنًا ، اكتشفت أخيرًا ما هي المشكلة ...

أنا أستخدم RSOLR للحصول على بيانات بلدي من SOLR ، وعلى الترميز الافتراضي لجميع النتائج هو للأسف "US-ASCII" كما هو مذكور هنا (والتحقق من نفسي):http://groups.google.com/group/rsolr/browse_thread/thread/2d4890fa7737e7ef#

لذلك تحتاج إلى فرض الترميز على النحو التالي:

my_string.force_encoding(Encoding::UTF_8)

ربما يكون هناك خيار ترميز لطيف لتوفير RSOLR!

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