سؤال

لدينا أنواع مختلفة من الواصلات/الشرطات (في بعض النص) المأهولة بالسكان في ديسيبل. قبل مقارنتها مع بعض نص إدخال المستخدم ، يجب أن أقوم بتطبيع أي نوع من الشرطات/الواصلات بالواصلة/ناقص بسيطة (ASCII 45).

الشرطات المحتملة التي يتعين علينا تحويلها هي:

Minus(−) U+2212 − or − or −
Hyphen-minus(-) U+002D -
Hyphen(-) U+2010
Soft Hyphen   U+00AD  ­
Non-breaking hyphen  U+2011  &#8209
Figure dash(‒)  U+2012 (8210) ‒ or ‒
En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —
Horizontal bar(―) U+2015 (8213) ― or ―

يجب تحويل كل هذه إلى الواصلة (-) باستخدام GSUB. لقد استخدمت شارديت جوهرة لاكتشاف نوع تشفير الأحرف من السلسلة التي تم جلبها. إنه يظهر Windows-1252. لقد حاولت Iconv لتحويل الترميز إلى ASCII. لكنه يلقي استثناء ICONV :: غير شرعي.

Ruby -V => Ruby 1.8.7 (2009-06-12 Patchlevel 174) [i686-darwin9.8.0
Rails -V => Rails 2.3.5
mysql تشفير => 'latin1'

أي فكرة عن كيفية تحقيق هذا؟

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

المحلول

التحذير: لا أعرف شيئًا عن روبي ، لكن لديك مشاكل لا علاقة لها بلغة البرمجة التي تستخدمها.

لا تحتاج إلى التحويل Hyphen-minus(-) U+002D - إلى simple hyphen/minus (ascii 45); ؛ انهم نفس الشيء.

تعتقد أن ترميز قاعدة البيانات latin1. إن بيان "البيانات الخاصة بي مشفر في ISO-8859-1 AKA LATIN1" موجود مع "The Check Is In The Mail" و "بالطبع سأظل أحبك في الصباح". كل ما يخبرك هو أنه ترميز واحد بايت لكل حرف.

على افتراض أن "سلسلة الجلب" تعني "سلسلة البايت المستخرجة من قاعدة البيانات" ، chardet من المحتمل جدًا أن يكون صحيحًا تمامًا في الإبلاغ windows-1252 الملقب ب cp1252 - ومع ذلك قد يكون هذا عن طريق الصدفة chardet يبدو في بعض الأحيان أنه يذكر أنه كإعداد افتراضي عندما يستنفد إمكانيات أخرى.

(أ) لا يمكن فك تشفير أحرف Unicode هذه latin1 أو cp1252 أو ascii:

Minus(−) U+2212 − or − or −
Hyphen(-) U+2010
Non-breaking hyphen  U+2011  &#8209
Figure dash(‒)  U+2012 (8210) ‒ or ‒
Horizontal bar(―) U+2015 (8213) ― or ―

ما الذي يمنحك الانطباع بأنها قد تظهر في الإدخال أو في قاعدة البيانات؟

(ب) يمكن فك تشفير أحرف Unicode هذه cp1252 لكن لا latin1 أو ascii:

En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —

هذه (على الأرجح en dash) هي ما تحتاجه حقًا إلى تحويله إلى واصلة ASCII/dash. ماذا كان في السلسلة chardet ذكرت كما windows-1252?

(ج) يمكن فك تشفير هذا cp1252 و latin1 لكن لا ascii:

Soft Hyphen   U+00AD  ­

إذا كانت السلسلة تحتوي على أحرف غير ASCII ، فإن أي محاولة (باستخدام iconv أو أي طريقة أخرى) لتحويلها إلى ascii سوف تفشل ، ما لم تستخدم نوعًا من "التجاهل" أو "استبداله" ?"الخيار. لماذا تحاول القيام بذلك؟

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