XmlWriter输出xml文档编码格式问题
2013-01-06 21:55
267 查看
请看下面这段代码:
using (StringWriter sr = new StringWriter())
{
XmlWriterSettings st = new XmlWriterSettings();
st.Encoding = Encoding.UTF8;
//这里的设置将不会起作用
XmlWriter xw = XmlWriter.Create(sr, st);
DataTable _dt = ds.Tables[0];
XmlDocument xml = new XmlDocument();
XmlNode root = xml.CreateElement(ds.DataSetName);
XmlNode nodecollect = null;
if (_dt.Rows.Count > 0)
{
nodecollect = xml.CreateElement(new StringBuilder(_dt.TableName).Append("s").ToString());
XmlAttribute attr = xml.CreateAttribute("list");
attr.Value = "true";
nodecollect.Attributes.Append((XmlAttribute)attr);
root.AppendChild(nodecollect);
}
foreach (DataRow _row in _dt.Rows)
{
XmlNode newnode = xml.CreateElement(_dt.TableName);
for (int i = 0; i < _dt.Columns.Count; i++)
{
XmlNode item = xml.CreateElement(_dt.Columns[i].ColumnName);
item.InnerText = _row[i].ToString();
newnode.AppendChild(item);
}
nodecollect.AppendChild(newnode);
}
xml.AppendChild(root);
xml.Save(xw);
return sr.ToString();
}
那么sr输出的字符串中xml的编码是什么?
实际的输出结果是:utf-16;
那么为什么我在XmlWriterSetting中已经设置uft-8,而输出的依然是utf-16呢?
答案如下:
参看:http://msdn.microsoft.com/zh-cn/library/system.xml.xmlwritersettings.encoding.aspx
Encoding 属性仅应用于使用指定 Stream 或者指定文件名创建的 XmlWriter 实例。如果使用指定的 TextWriter 创建 XmlWriter 实例,则 Encoding 属性通过对基础 TextWriter的编码来重写。例如,如果将特定 XmlWriter 的这一属性设置为
Unicode (UTF-16),但基础编写器是一个编码设置为 UTF8 的 StreamWriter(源自 TextWriter),则输出将经过
UTF8 编码。
=============
因为我们在上面的代码中用到的StringWriter类,它继承自TextWriter,并且StringWriter的Encoding属性实现为Encoding.Unicode(也就是utf-16),所以按照上面的说法,StringWriter作为基础编写器将会覆盖XmlWriter的Encoding属性,所以我们在最终输出的字符串中看到的编码是utf-16而不是utf-8.
那么我们如何在输出的字符串中可以按照自己在XmlWriter中的Encoding属性指定的来输出呢?
答案如下:(我自己的想法)
using( MemoryStream s = new MemoryStream())
{
XmlWriterSettings st = new XmlWriterSettings();
st.Encoding = Encoding.Unicode;
//st.Encoding = Encoding.UTF8;
//XmlWriter xw = XmlWriter.Create(sr, st);
XmlWriter xw = XmlWriter.Create(s, st);
DataTable _dt = ds.Tables[0];
XmlDocument xml = new XmlDocument();
XmlNode root = xml.CreateElement(ds.DataSetName);
XmlNode nodecollect = null;
if (_dt.Rows.Count > 0)
{
nodecollect = xml.CreateElement(new StringBuilder(_dt.TableName).Append("s").ToString());
XmlAttribute attr = xml.CreateAttribute("list");
attr.Value = "true";
nodecollect.Attributes.Append((XmlAttribute)attr);
root.AppendChild(nodecollect);
}
foreach (DataRow _row in _dt.Rows)
{
XmlNode newnode = xml.CreateElement(_dt.TableName);
for (int i = 0; i < _dt.Columns.Count; i++)
{
XmlNode item = xml.CreateElement(_dt.Columns[i].ColumnName);
item.InnerText = _row[i].ToString();
newnode.AppendChild(item);
}
nodecollect.AppendChild(newnode);
}
xml.AppendChild(root);
xml.Save(xw);
return System.Text.Encoding.Unicode.GetString(s.ToArray());
//return System.Text.Encoding.UTF8.GetString(s.ToArray());
//return sr.ToString();
}
将上面的代码修改三处:
(1)基础编辑器改为不是派生自TextWriter的MemoryStream;(这样就不会有Encoding的干扰)
(2)在原有的XmlWriter的Setting处设置成自己想要的编码格式;
(3)返回字符串时,用对的编码对字节转化为字符串。
using (StringWriter sr = new StringWriter())
{
XmlWriterSettings st = new XmlWriterSettings();
st.Encoding = Encoding.UTF8;
//这里的设置将不会起作用
XmlWriter xw = XmlWriter.Create(sr, st);
DataTable _dt = ds.Tables[0];
XmlDocument xml = new XmlDocument();
XmlNode root = xml.CreateElement(ds.DataSetName);
XmlNode nodecollect = null;
if (_dt.Rows.Count > 0)
{
nodecollect = xml.CreateElement(new StringBuilder(_dt.TableName).Append("s").ToString());
XmlAttribute attr = xml.CreateAttribute("list");
attr.Value = "true";
nodecollect.Attributes.Append((XmlAttribute)attr);
root.AppendChild(nodecollect);
}
foreach (DataRow _row in _dt.Rows)
{
XmlNode newnode = xml.CreateElement(_dt.TableName);
for (int i = 0; i < _dt.Columns.Count; i++)
{
XmlNode item = xml.CreateElement(_dt.Columns[i].ColumnName);
item.InnerText = _row[i].ToString();
newnode.AppendChild(item);
}
nodecollect.AppendChild(newnode);
}
xml.AppendChild(root);
xml.Save(xw);
return sr.ToString();
}
那么sr输出的字符串中xml的编码是什么?
实际的输出结果是:utf-16;
那么为什么我在XmlWriterSetting中已经设置uft-8,而输出的依然是utf-16呢?
答案如下:
参看:http://msdn.microsoft.com/zh-cn/library/system.xml.xmlwritersettings.encoding.aspx
Encoding 属性仅应用于使用指定 Stream 或者指定文件名创建的 XmlWriter 实例。如果使用指定的 TextWriter 创建 XmlWriter 实例,则 Encoding 属性通过对基础 TextWriter的编码来重写。例如,如果将特定 XmlWriter 的这一属性设置为
Unicode (UTF-16),但基础编写器是一个编码设置为 UTF8 的 StreamWriter(源自 TextWriter),则输出将经过
UTF8 编码。
=============
因为我们在上面的代码中用到的StringWriter类,它继承自TextWriter,并且StringWriter的Encoding属性实现为Encoding.Unicode(也就是utf-16),所以按照上面的说法,StringWriter作为基础编写器将会覆盖XmlWriter的Encoding属性,所以我们在最终输出的字符串中看到的编码是utf-16而不是utf-8.
那么我们如何在输出的字符串中可以按照自己在XmlWriter中的Encoding属性指定的来输出呢?
答案如下:(我自己的想法)
using( MemoryStream s = new MemoryStream())
{
XmlWriterSettings st = new XmlWriterSettings();
st.Encoding = Encoding.Unicode;
//st.Encoding = Encoding.UTF8;
//XmlWriter xw = XmlWriter.Create(sr, st);
XmlWriter xw = XmlWriter.Create(s, st);
DataTable _dt = ds.Tables[0];
XmlDocument xml = new XmlDocument();
XmlNode root = xml.CreateElement(ds.DataSetName);
XmlNode nodecollect = null;
if (_dt.Rows.Count > 0)
{
nodecollect = xml.CreateElement(new StringBuilder(_dt.TableName).Append("s").ToString());
XmlAttribute attr = xml.CreateAttribute("list");
attr.Value = "true";
nodecollect.Attributes.Append((XmlAttribute)attr);
root.AppendChild(nodecollect);
}
foreach (DataRow _row in _dt.Rows)
{
XmlNode newnode = xml.CreateElement(_dt.TableName);
for (int i = 0; i < _dt.Columns.Count; i++)
{
XmlNode item = xml.CreateElement(_dt.Columns[i].ColumnName);
item.InnerText = _row[i].ToString();
newnode.AppendChild(item);
}
nodecollect.AppendChild(newnode);
}
xml.AppendChild(root);
xml.Save(xw);
return System.Text.Encoding.Unicode.GetString(s.ToArray());
//return System.Text.Encoding.UTF8.GetString(s.ToArray());
//return sr.ToString();
}
将上面的代码修改三处:
(1)基础编辑器改为不是派生自TextWriter的MemoryStream;(这样就不会有Encoding的干扰)
(2)在原有的XmlWriter的Setting处设置成自己想要的编码格式;
(3)返回字符串时,用对的编码对字节转化为字符串。
相关文章推荐
- 解决CodeSmith代码模版输出文件的编码格式为有bom的UTF-8的问题
- Windows PowerShell 输出文件编码格式问题
- 解决程序编码格式正确,cmd命令行(DOS窗口)输出不正确的问题
- servlet从服务器磁盘文件读出到浏览器显示,中文乱码问题,不要忘记在输入流和输出流都要设置编码格式,否则一个地方没设置不统一就会各种乱码
- properties配置文件编码格式问题
- JAVA中的编码格式问题
- delphi 如何判断编码格式,解决乱码问题
- AFNetWorking 的编码格式问题
- 代码中涉及到编码格式问题的心得
- 关于visiou studio 编辑器 设置 UTF-8 无bom 编码格式的问题
- ubuntu下修改mysql编码格式的问题
- servlet中编码格式及设置乱码问题解决
- 服务器数据库编码格式问题解决方案
- 黄聪:php传递URL中文编码为带%的编码获取后乱码问题(页面utf-8格式)
- x264编码视频流输出格式
- python中文编码与json中文输出问题详解
- AFN post的数据编码格式问题
- jmeter常见问题(二)编码格式错误
- 【PHP-文件下载】遇到的编码格式不正确导致文件下载后乱码、文件大小发生改变的问题
- C++跨平台编码文件格式问题