سؤال

كنت أحاول أن قم بتحويل ملف من UTF-8 إلى ARABIC-1265 الترميز باستخدام واجهات برمجة تطبيقات الترميز في C#، لكنني واجهت مشكلة غريبة مفادها أن بعض الأحرف لا يتم تحويلها بشكل صحيح مثل "LA" في العبارة التالية "ﻣﺣﻣ ﺻﻼ ح ح udadl" يبدو أنها "ﻣﺣﻣd ﺻ؟ أخبرني بعض أصدقائي أن هذا لأن هذه الشخصيات هي من نماذج العرض العربي B. أقوم بإنشاء الملف باستخدام Notepad ++ وحفظه كـ UTF-8.

هنا هو الرمز الذي أستخدمه

    StreamReader sr = new StreamReader(@"C:\utf-8.txt", Encoding.UTF8);
    string str = sr.ReadLine();
    StreamWriter sw = new StreamWriter(@"C:\windows-1256.txt", false, Encoding.GetEncoding("windows-1256"));
    sw.Write(str);
    sw.Flush();
    sw.Close();

لكنني لا أعرف كيفية تحويل الملف بشكل صحيح باستخدام نماذج العرض التقديمي هذا في C#.

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

المحلول

نعم ، تحتوي السلسلة الخاصة بك على الكثير من الأربطة التي لا يمكن تمثيلها في صفحة رمز 1256. سيكون عليك أن تحلل السلسلة قبل كتابتها. مثله:

  str = str.Normalize(NormalizationForm.FormKD);
  st.Write(str);

نصائح أخرى

لإعطاء إجابة أكثر عمومية:

  • ترميز Windows-1256 هو تشفير الأحرف 8 بت قديمة. يحتوي على 256 حرفًا فقط ، منها 60 حرفًا فقط من الحروف العربية.

  • يونيكود لديه مجموعة أوسع من الشخصيات. على وجه الخصوص ، يحتوي على:

    • الشخصيات العربية "العادية" ، U+0600 إلى U+06FF. من المفترض أن تستخدم هذه النصوص العربية العادية ، بما في ذلك النص المكتوب بلغات أخرى تستخدم البرنامج النصي العربي ، مثل الفارسي. على سبيل المثال ، "LA" هو U+0644 (ل) متبوعًا بـ U+0627 (CH).

    • أحرف "نموذج العرض" ، U+FB50 إلى U+FDFF ("عروض العرض-A") و U+Fe70 إلى U+FEFF ("عرض العرض-B"). هذه ليست المقصود استخدامها لتمثيل النص العربي. وهي مخصصة في المقام الأول للتوافق ، خاصة مع تنسيقات ملفات الخطوط التي تتطلب نقاط رمز منفصلة لكل شكل مختلف من كل شكل من الأحرف ومجموعة من الأحرف المربوطة. يتم تمثيل الرباط "la" بواسطة نقطة codepoint (U+FEFB) على الرغم من كونها حرفين.

  • عند الترميز داخل Windows-1256 ، سيتم تشغيل ترميز .NET لنظام التشغيل Windows-1256 تلقائيًا من الأحرف من كتلة العرض التقديمي إلى "النص العادي" لأنه ليس لديه خيار آخر (باستثناء بالطبع لتحويل كل شيء إلى علامات السؤال). لأسباب واضحة ، يمكن أن تفعل ذلك فقط مع الشخصيات التي لديها بالفعل "مكافئ".

  • عند فك التشفير من Windows-1256 ، سيقوم ترميز .NET لنظام التشغيل Windows-1256 دائمًا بإنشاء أحرف من كتلة "النص العادي".

كما اكتشفنا ، يحتوي ملف الإدخال الخاص بك على أحرف ليست ممثلة في Windows-1256. سوف تتحول مثل هذه الشخصيات إلى علامات استجواب (?). علاوة على ذلك ، تلك الشخصيات التقديمية التي فعل لديك ما يعادل النص الطبيعي ، سوف يغير سلوك الربط ، لأن هذا هو النص العربي الطبيعي.

بادئ ذي بدء ، الشخصان اللذان نقلتهما ليس من أشكال العرض العربي كتلة. هم انهم \x0644 و \x0627, ، والتي هي من الكتلة العربية القياسية. ومع ذلك ، فقط للتأكد من أنني جربت الشخصية \xFEFB, ، أيّ هو "ما يعادل" (ليس ما يعادلها ، ولكنك تعرف) من أجل LA من كتلة أشكال العرض التقديمي ، وهي تعمل بشكل جيد حتى لذلك.

ثانياً ، سأفترض أنك تعني الترميز Windows-1256, ، وهو النص العربي الثامن 8 بت.

لذلك جربت ما يلي:

var input = "لا";
var encoding = Encoding.GetEncoding("windows-1256");
var result = encoding.GetBytes(input);
Console.WriteLine(string.Join(", ", result));

الإخراج الذي أحصل عليه 225, 199. لذلك دعونا نحاول إعادة تشغيله:

var bytes = new byte[] { 225, 199 };
var result2 = encoding.GetString(bytes);
Console.WriteLine(result2);

عادلة بما فيه الكفاية ، لا تعرض وحدة التحكم النتيجة بشكل صحيح - لكن نافذة الساعة في مصحح الأخطاء تخبرني أن الإجابة صحيحة (تقول "LA"). يمكنني أيضًا نسخ الإخراج من وحدة التحكم وهو صحيح في الحافظة.

لذلك ، فإن ترميز Windows-1256 يعمل بشكل جيد وليس من الواضح ما هي مشكلتك.

توصيتي:

  • اكتب جزءًا قصيرًا من التعليمات البرمجية التي تعرض المشكلة.

  • انشر سؤالًا جديدًا مع هذا الرمز.

  • في هذا السؤال ، صف بالضبط النتيجة التي تحصل عليها ، وما هي النتيجة التي توقعتها بدلاً من ذلك.

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