لا يمكن فهم هذه المشاكل ترميز أكس
-
05-07-2019 - |
سؤال
ووقطعة كبيرة من التعليمات البرمجية التالية (مقصوص الإيجاز) يولد وثيقة 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).