النماذج التقديمية العربية B دعم في C#
-
04-10-2019 - |
سؤال
كنت أحاول أن قم بتحويل ملف من 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 يعمل بشكل جيد وليس من الواضح ما هي مشكلتك.
توصيتي:
اكتب جزءًا قصيرًا من التعليمات البرمجية التي تعرض المشكلة.
انشر سؤالًا جديدًا مع هذا الرمز.
في هذا السؤال ، صف بالضبط النتيجة التي تحصل عليها ، وما هي النتيجة التي توقعتها بدلاً من ذلك.