C#生成XML文件,编码为UTF-8,怎么让它以ANSI格式保存 (在线等)

时间:2023-01-05 15:49:05
 try
            {
                XmlDocument _doc = new XmlDocument();
                XmlElement d = _doc.CreateElement("bin-data");
                _doc.AppendChild(d);
                XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "UTF-8", "");
                _doc.InsertBefore(xmldecl, d);
                for (int i = 0; i < shipdatalist.Count; i++)
                {
                    shipdata = shipdatalist[i];
                    XmlElement OSP_SHIP = _doc.CreateElement("lot-info");
                    OSP_SHIP.SetAttribute("seq", (i + 1).ToString());
                    XmlElement ship_to = _doc.CreateElement("ship-to");
                    XmlElement ship_no = _doc.CreateElement("ship-no");
                    XmlElement ship_date = _doc.CreateElement("ship-date");
                    XmlElement prod = _doc.CreateElement("prod");
                    XmlElement lot_no = _doc.CreateElement("lot-no");
                    XmlElement date_code = _doc.CreateElement("date-code");
                    XmlElement po_no = _doc.CreateElement("po-no");
                    XmlElement good_die_qty = _doc.CreateElement("good-die-qty");
                    XmlElement loss_qty1 = _doc.CreateElement("loss-qty1");
                    XmlElement close_flag = _doc.CreateElement("close-flag");
                    XmlElement inv_no = _doc.CreateElement("inv-no");
                    d.AppendChild(OSP_SHIP);
                    OSP_SHIP.AppendChild(ship_to);
                    OSP_SHIP.AppendChild(ship_no);
                    OSP_SHIP.AppendChild(ship_date);
                    OSP_SHIP.AppendChild(prod);
                    OSP_SHIP.AppendChild(lot_no);
                    OSP_SHIP.AppendChild(date_code);
                    OSP_SHIP.AppendChild(po_no);
                    OSP_SHIP.AppendChild(good_die_qty);
                    OSP_SHIP.AppendChild(loss_qty1);
                    OSP_SHIP.AppendChild(close_flag);
                    OSP_SHIP.AppendChild(inv_no);
                    ship_to.InnerText = shipdata.ship_to.ToString();
                    ship_no.InnerText = shipdata.ship_no.ToString();
                    ship_date.InnerText = shipdata.ship_date.ToString();
                    prod.InnerText = shipdata.prod.ToString();
                    lot_no.InnerText = shipdata.lot_no.ToString();
                    date_code.InnerText = shipdata.date_code.ToString();
                    po_no.InnerText = shipdata.po_no.ToString();
                    good_die_qty.InnerText = shipdata.good_die_qty.ToString();
                    loss_qty1.InnerText = shipdata.loss_qty1.ToString();
                    close_flag.InnerText = shipdata.close_flag.ToString();
                    inv_no.InnerText = shipdata.inv_no.ToString();
                    _doc.Save(filepath);
                }
                return true;

10 个解决方案

#1


引用 楼主 haoxiaoji 的回复:
    ...
    XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "UTF-8", "");
    ...

你不是自己写好了UTF-8了吗?

XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0",  "ASCII", "");

#2


ANSI格式 不是好的交换格式。
在中文系统下,ANSI编码可能是GB2312。
在日文系统下,ANSI编码可能是JIS。

如果你要用GB2312,就直接写_doc.CreateXmlDeclaration("1.0", "gb2312", "");
不过,建议还是用UTF-8或UTF-16,等常用编码。

#3


Encoding.Default
这个就会自动LS所说的系统设置的语言了

#4


自动匹配LS所说的系统设置的语言了

#5


客户要求这样写XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "UTF-8", "");
然后生成的文件要另存为ANSI。
XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "ASCII", ""); 这样的话中文内容好像显示不出来呢。
我自己找了一个方法:在save后加上System.IO.File.WriteAllText(filepath, System.IO.File.ReadAllText(filepath, Encoding.UTF8), Encoding.Default); 

#6


引用 5 楼 haoxiaoji 的回复:
客户要求这样写XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "UTF-8", "");
然后生成的文件要另存为ANSI。


这是挂羊头卖狗肉:)
你可以建议用户,说这种文件将会导致问题。

#7


一般按照一贯作风,用户会很明确的告诉你他就是要这种格式,然后要是出问题了,他会问你为什么要这么做

#8


应该不会这是抛给客户的日常报表信息,是*的客户,他们那边的编码什么的不太清楚,可能他们那边是以一个字节的方式去读所以这样要求。之前其他的报表用BIG5的,这份报表不知道为毛要这种要求啊~囧。我之前的那个方法行吗,大神们?~客户还没有回复我。

#9


假定里面有汉字,假定文件编码是*的BIG5,那么那种xml将是非法的xml(你存盘的文件读不回来):

static void Test(string filename)
{
    string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root>繁體</root>";
    File.WriteAllText(filename, xml, Encoding.GetEncoding("BIG5"));

    XmlDocument doc = new XmlDocument();
    doc.Load(filename); //<-- 将抛出异常(Invalid character in the given encoding...)
}

#10


非常抱歉,我以为无满意贴是可以大家都给些分的,看错了,非常抱歉,这个太坑了。

#1


引用 楼主 haoxiaoji 的回复:
    ...
    XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "UTF-8", "");
    ...

你不是自己写好了UTF-8了吗?

XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0",  "ASCII", "");

#2


ANSI格式 不是好的交换格式。
在中文系统下,ANSI编码可能是GB2312。
在日文系统下,ANSI编码可能是JIS。

如果你要用GB2312,就直接写_doc.CreateXmlDeclaration("1.0", "gb2312", "");
不过,建议还是用UTF-8或UTF-16,等常用编码。

#3


Encoding.Default
这个就会自动LS所说的系统设置的语言了

#4


自动匹配LS所说的系统设置的语言了

#5


客户要求这样写XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "UTF-8", "");
然后生成的文件要另存为ANSI。
XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "ASCII", ""); 这样的话中文内容好像显示不出来呢。
我自己找了一个方法:在save后加上System.IO.File.WriteAllText(filepath, System.IO.File.ReadAllText(filepath, Encoding.UTF8), Encoding.Default); 

#6


引用 5 楼 haoxiaoji 的回复:
客户要求这样写XmlDeclaration xmldecl = _doc.CreateXmlDeclaration("1.0", "UTF-8", "");
然后生成的文件要另存为ANSI。


这是挂羊头卖狗肉:)
你可以建议用户,说这种文件将会导致问题。

#7


一般按照一贯作风,用户会很明确的告诉你他就是要这种格式,然后要是出问题了,他会问你为什么要这么做

#8


应该不会这是抛给客户的日常报表信息,是*的客户,他们那边的编码什么的不太清楚,可能他们那边是以一个字节的方式去读所以这样要求。之前其他的报表用BIG5的,这份报表不知道为毛要这种要求啊~囧。我之前的那个方法行吗,大神们?~客户还没有回复我。

#9


假定里面有汉字,假定文件编码是*的BIG5,那么那种xml将是非法的xml(你存盘的文件读不回来):

static void Test(string filename)
{
    string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root>繁體</root>";
    File.WriteAllText(filename, xml, Encoding.GetEncoding("BIG5"));

    XmlDocument doc = new XmlDocument();
    doc.Load(filename); //<-- 将抛出异常(Invalid character in the given encoding...)
}

#10


非常抱歉,我以为无满意贴是可以大家都给些分的,看错了,非常抱歉,这个太坑了。