سؤال

ووقطعة كبيرة من التعليمات البرمجية التالية (مقصوص الإيجاز) يولد وثيقة XML، وتبصق بها إلى ملف. إذا قمت بفتح ملف في Visual Studio يبدو أن في الحروف الصينية. إذا أنا فتحه في المفكرة يبدو كما هو متوقع. إذا كنت Console.WriteLine تبدو الصحيح.

وأنا أعلم أنه المتعلقة الترميز، لكنني لو كان لي كل البط الترميز في صف واحد. ما هو مفقود؟

StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.Unicode;
settings.Indent = true; 
settings.IndentChars = "\t";
using (XmlWriter textWriter = XmlWriter.Create(new StringWriter(stringBuilder), settings))
{
    textWriter.WriteStartElement("Submission");
    textWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
    textWriter.WriteEndElement();
}

using (StreamWriter sw = new StreamWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)))
            {
                sw.Write(stringBuilder.ToString());
            }
هل كانت مفيدة؟

المحلول

والمشكلة هي أن كنت تكتب ل<م> القرص باستخدام UTF-8، لكنه سوف <م> المطالبة أن تكون UTF-16 لأن هذا هو ما يستخدم StringWriter افتراضيا - ولأنك وضع صراحة لاستخدام Encoding.Unicode فضلا

وأبسط طريقة لإصلاح هذا هو استخدام StringWriter التي تعلن عن نفسها كما UTF-8:

public class Utf8StringWriter : StringWriter
{
    public override Encoding
    {
         get { return Encoding.UTF8; }
    }
}

... ثم قم بإزالة خط settings.Encoding = Encoding.Unicode. وبهذه الطريقة سوف تستخدم UTF-8 طوال الوقت. (في الواقع، يتم تجاهل الملكية Encoding من XmlWriterSettings عند إنشاء XmlWriter مع TextWriter على أي حال).

إذا كنت حقا <م> تريد UTF-16، ثم عند إنشاء StreamWriter، حدد Encoding.Unicode هناك أيضا.

نصائح أخرى

ولست متأكدا ما هو Encoding.Unicode ولكن اعتقد انها UTF-16 الذي يكتب اثنين بايت لكل حرف في الملف. لنص ASCII العادي، واحدة من وحدات البايت هو دائما 0.

وحاول UTF-8 بدلا من ذلك. وينبغي أن ينظر الى نفسه في أي محرر إلا إذا كنت تستخدم أحرف خاصة (مع وجود نقطة رمز> = 128).

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