c# XmlReader编码定义为utf-8,但文件中有Iso-8859-1字符

本文关键字:文件 Iso-8859-1 字符 编码 XmlReader 定义 utf-8 | 更新日期: 2023-09-27 18:02:33

我有一个新问题。

首先,感谢您所有的回复和帮助,我真的很感激!

所以,我的实际问题是:国家发布了一个需要填充的xml文件模型,并使用UTF-8编码保存模型数据!当人们在软件上填写数据时,他们使用一些ISO-8859-1编码类型的字符,如:Ç Õ Á并再次生成文件,继续保存为UTF-8并使用重音。

处理数据的程序使用以下代码:

    XmlReader xmlFile = XmlReader.Create(ofd.FileName, new XmlReaderSettings());
                ds.ReadXml(xmlFile);
                var doc = XDocument.Load(ofd.FileName);
                var columns = doc.Descendants("FIELD")
                    .Attributes("attrname")
                    .Select(fieldName => new DataColumn(fieldName.Value))
                    .ToArray();
                var rows = doc.Descendants("ROW")
                    .Select(row => columns.Select(col => (string)row.Attribute(col.ColumnName)).ToArray());
                var table = new DataTable();
                table.Columns.AddRange(columns);
                foreach (var row in rows)
                {
                    table.Rows.Add(row);
                }
                // Aqui ele mostra os dados das tabelas do arquivo XML exibindo seus dados.
                dataGridView1.DataSource = table;

所以,当我试图读取文件时,我无法读取,因为没有打开文件。

我有两个选项来正确阅读:选项1:在我的程序打开之前,我需要更改<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>

但这是非法的。

或者我需要改变代码像这张照片到其他没有口音(这给了太多的工作要做):图像移除重音

那么,为什么要用ISO-8859-1(读取xml重音)在c#上处理文本而不改变xml文件上的编码类型呢?

谢谢

PS:我看了建议的线程,但没有完成像我这样的问题。

谢谢

c# XmlReader编码定义为utf-8,但文件中有Iso-8859-1字符

我将编码改为1252,一切正常。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using System.Data;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:'temp'test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            StreamReader sReader = new StreamReader(FILENAME, Encoding.GetEncoding(1252));
            XmlReader reader = XmlReader.Create(sReader);
            Dictionary<string, string> colDict = new Dictionary<string, string>();
            while (!reader.EOF)
            {
                if (reader.Name != "FIELD")
                {
                    reader.ReadToFollowing("FIELD");
                }
                if (!reader.EOF)
                {
                    XElement field = (XElement)XElement.ReadFrom(reader);
                    string attrname = (string)field.Attribute("attrname");
                    string fieldtype = (string)field.Attribute("fieldtype");
                    switch (fieldtype)
                    {
                        case "string":
                            dt.Columns.Add(attrname, typeof(string));
                            break;
                        case "i4":
                            dt.Columns.Add(attrname, typeof(int));
                            break;
                    }
                    colDict.Add(attrname, fieldtype);
                }
            }
            reader.Close();
            sReader = new StreamReader(FILENAME, Encoding.GetEncoding(1252));
            reader = XmlReader.Create(sReader);
            while (!reader.EOF)
            {
                if (reader.Name != "ROW")
                {
                    reader.ReadToFollowing("ROW");
                }
                if (!reader.EOF)
                {
                    XElement row = (XElement)XElement.ReadFrom(reader);
                    DataRow newRow = dt.Rows.Add();
                    foreach (XAttribute attrib in row.Attributes())
                    {
                        string colName = attrib.Name.LocalName;
                        if (colDict.ContainsKey(colName))
                        {
                            switch (colDict[colName])
                            {
                                case "string":
                                    newRow[colName] = (string)attrib;
                                    break;
                                case "i4":
                                    newRow[colName] = (int)attrib;
                                    break;
                            }
                        }
                    }
                }
            }
        }
    }
}