سؤال

لدي ملف يحتوي على نص يونيكود في ترميز غير معلن.أريد أن تفحص من خلال هذا الملف تبحث عن أي نقاط رمز العربية في نطاق ش + 0600 من خلال ش + 06 ف ، وتعيين كل نقطة رمز ونيكود المعمول بها إلى بايت من أسي ، بحيث يتكون الملف الذي تم إنتاجه حديثا من أحرف أسي بحتة ، مع جميع نقاط رمز تحت 128.

كيف أذهب عن القيام بذلك?حاولت قراءتها بنفس الطريقة كما تقرأ أسي ، ولكن يظهر بلدي محطة ?? لأنه حرف متعدد البايت.

ملاحظة:يتكون الملف من مجموعة فرعية من مجموعة أحرف يونيكود ، وحجم المجموعة الفرعية أصغر من حجم أحرف أسي.لذلك أنا قادرة على القيام 1:1 رسم الخرائط من هذه المجموعة الفرعية يونيكود معينة إلى أسي.

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

المحلول

هذا إما مستحيل أو تافه. فيما يلي الطرق البسيطة:

  • إذا لم تتجاوز أي نقطة رمز 127 ، فاكتبها ببساطة في ASCII. تم.

  • إذا تجاوزت بعض نقاط الشفرة 127 ، فيجب عليك اختيار كيفية تمثيلها في ASCII. تتمثل الإستراتيجية الشائعة في استخدام بناء جملة XML ، كما هو الحال في رمز الترقيم العام لـ U + 03B1. سيتطلب هذا ما يصل إلى 8 أحرف ASCII لكل نقطة رمز Unicode عبر ASCII مكتوبة.

المستحيلات التي أتركها كتدريب للملصق الأصلي. لن أذكر حتى الأساليب الحمقاء لكن الممكنة (اقرأ: غبية) ، لأنها كثيرة. إتلاف البيانات جريمة كبرى في معالجة البيانات ، ويجب التعامل معها على هذا الأساس.

لاحظ أنني أفترض من خلال "حرف Unicode" أنك تعني في الواقع "نقطة رمز Unicode" ؛ أي ، شخصية مرئية للمبرمج. بالنسبة إلى الأحرف المرئية للمستخدم ، تحتاج إلى "Unicode grapheme (مجموعة)" بدلاً من ذلك.

أيضًا ، ما لم تطبيع النص أولاً ، فإنك ستكره العالم. أقترح NFD.


تحرير

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

Genacodicetagpre

هذا يعالج فقط نقاط الرمز هذه: Genacodicetagpre

لذا سيتعين عليك توسيعه ليشمل أي رسم تريده.

إذا كنت تريده في نص برمجي بدلاً من أداة سطر أوامر ، فهو سهل أيضًا ، بالإضافة إلى أنه يمكنك التحدث عن الأحرف بالاسم من خلال إعداد تعيين ، مثل: Genacodicetagpre

إذا كان من المفترض أن يكون هذا مكونًا في برنامج أكبر لـ C ++ ، فربما تريد تطبيقه في C ++ ، ربما ولكن ليس ضروريًا باستخدام مكتبة ICU4C ، والتي تتضمن دعم الترجمة الصوتية.

ولكن إذا كان كل ما تحتاجه هو تحويل بسيط ، فأنا لا أفهم سبب كتابة برنامج C ++ مخصص. يبدو وكأنه طريقة عمل كثير.

نصائح أخرى

لا يمكنك قراءة البيانات إلا إذا كنت تعرف التنسيق.افتح الملف باستخدام Microsoft Word ، وانتقل إلى "حفظ باسم" ، "تنسيقات أخرى" ، "نص عادي (.txt)" ، احفظ.في مربع التحويل ، حدد "ترميز آخر" و "Unicode" (وهو UTF16LE) و "موافق".تم حفظ هذا الملف الآن بتنسيق UTF16LE.

Genacodicetagpre

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

من أجل تحليل نقاط كود يونيكود ، يجب عليك أولا فك تشفير الملف إلى تمثيل يونيكود غير المشفر (وهو ما يعادل أوتف-32).من أجل القيام بذلك ، تحتاج أولا إلى معرفة كيفية تشفير الملف بحيث يمكن فك تشفيره.على سبيل المثال ، يونيكود كوديبوانتس U+0600 و U+06FF يتم ترميزها كـ 0xD8 0x80 و 0xDB 0xBF في أوتف-8 ، كما 0x00 0x06 و 0xFF 0x06 في أوتف-16 لي ، كما 0x06 0x00 و 0x06 0xFF في أوتف-16بي ، الخ.

إذا كان الملف يبدأ مع بوم ، ثم كنت تعرف الترميز الدقيق المستخدمة ويمكن تفسير بقية الملف وفقا لذلك.على سبيل المثال ، أوتف - 8 بوم هو 0xEF 0xBB 0xBF, ، أوتف-16 لي هو 0xFF 0xFE, ، أوتف-16بي هو 0xFE 0xFF, ، وهلم جرا.

إذا لم يبدأ الملف مع بوم ، ثم لديك لتحليل البيانات وأداء الاستدلال على ذلك للكشف عن الترميز ، ولكن هذا ليس 100 ٪ موثوق بها.على الرغم من أنه من السهل إلى حد ما للكشف عن ترميزات أوتف ، فإنه يكاد يكون من المستحيل للكشف عن ترميزات أنسي مع أي قدر من الموثوقية.حتى الكشف عن ترميزات أوتف دون وجود بوم يمكن أن يسبب نتائج خاطئة في بعض الأحيان (قراءة هذا, هذا, ، و هذا).

لا تخمن أبدا ، سوف تخاطر بفقدان البيانات.إذا كنت لا تعرف الترميز الدقيق المستخدم ، فاطلب من المستخدم ذلك.

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