C# XML 字符串编码问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# XML 字符串编码问题相关的知识,希望对你有一定的参考价值。
数据库配置写在某XML文档里,上头要求XML要求采用UTF-8编码,便于平台移植。
当XML采用UTF-8编码时,程序无法读取XML文档中的数据库配置信息。
当XML采用GB2312方式编码时,程序可以读取XML文件中的信息。
我用的是VS2005,用C#开发算法库,已经将程序中所有gb2312替换成utf-8,同时已经在高级页面设置里面改成了utf-8。可是当xml中的的编码方式为utf-8时,仍然无法读取,只能改成gb2312。
希望各位大神告知解决方式。我是xml小白,现在做的是纯算法库的开发。
如果XML中设置的编码方式为GB2312,是可以读取的。
除了把XML文件中最开始的那个声明变成 <?xml version="1.0" encoding="utf-8"?> 之外,还需要把这个XML文件本身另存为UTF-8的编码方式(在VisualStudio里面选择另存为,在“保存”按钮的右边有个向下小箭头,点开后选择UTF-8)。不知楼主说的“高级页面设置”是什么?指的是“文件 - 高级保存选项”吗?
此外,请问楼主的代码是如何读取这个XML的?是怎么失败的?抛出什么异常了? 参考技术A 如果以utf-8不能读取xml,说明xml仍然是gb2312的编码a,你需要把所有gb2312编码的xml重新编码成utf-8
还有你的仍然无法读取的原因是什么,说不定跟编码没关系 参考技术B private
string
sickness(string
xmlfile)
dataset
ds
=
new
dataset();
ds.readxml("sick.xml");
return
ds.tables[0].rows[0][0].tostring();
用法:先把你的xml修改一下,去掉其中的转义字符\。存为sick.xml(如果用浏览器能打开,说明格式正确了。)然后上面的函数返回的就是你想要的字符串。
在 C# 中安全地解析 XML
【中文标题】在 C# 中安全地解析 XML【英文标题】:Securely parse XML in C# 【发布时间】:2017-02-16 22:08:22 【问题描述】:我有一个 C# 应用程序,它从表示 UTF-8 编码的 XML 消息的外部服务接收字节数组。此 XML 数据包含敏感数据,我不希望将其存储在字符串对象中,因为字符串是不可变的,并且在完成处理后我无法擦除这些值。我目前正在使用 System.XML.XmlReader 将值解析为字符串(参见下面的代码)。在不让我的代码(或我正在调用的代码)将敏感数据存储为字符串的情况下,我如何才能做到这一点?
byte[] messsage = Encoding.UTF8.GetBytes(request);
// Send message to the server.
sslStream.Write(messsage);
sslStream.Flush();
// read the response
byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
do
bytes = sslStream.Read(buffer, 0, buffer.Length);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);
// Check for ending tag.
if (messageData.ToString().IndexOf(expectedEndTag) != -1)
break;
while (bytes > 0);
string response = messageData.ToString();
using (XmlReader reader = XmlReader.Create(new StringReader(response)))
reader.ReadToFollowing("Success");
string successVal = reader.ReadElementContentAsString();
success = bool.Parse(successVal);
【问题讨论】:
加密值。无论如何,当它从外部服务传输时,它应该被加密,因为一些不良行为者可能会拦截数据。 “此 XML 数据包含敏感数据,我不希望将其存储在字符串对象中,因为字符串是不可变的,当我处理完它们后我无法擦除这些值”。请参阅安全字符串。它是保密的,而不是保存在内存中。 msdn.microsoft.com/en-us/library/… 如果您只是担心内存中的字符串,您可以考虑使用 SecureString,msdn.microsoft.com/en-us/library/… @rory.ap 数据在传输过程中被加密,但这是我需要将数据未加密但我希望将其存储在 byte[] 而不是字符串中的地方。 XML 文件中的敏感数据是十六进制编码的。 在撰写本文时,PCI-DSS 对内存中的机密保护没有要求。正如您所说,从序列化表单中解析它而不解密它无论如何都是不可能的。您可能想要做的是花一些时间确保内存中的存储真的是只是易失性的,并且不会意外地将潜在的秘密数据写入不期望的永久存储位置。这可能意味着确保禁用或适当保护任何故障转储,并且您没有系统或 VM 虚拟内存将易失性存储分页到磁盘。 【参考方案1】:根据答案,并考虑到字符串是不可变的事实,您应该编写自己的使用 char[] 的 XML 解析器。完成解析后,擦除 char 数组内容。要在程序中使用敏感数据,请使用SecureString 作为cmets 中建议的@Ga ber-ber 和@Mumbo。
这很难重复,但这样你可以确保在解析后立即擦除内存。
【讨论】:
以上是关于C# XML 字符串编码问题的主要内容,如果未能解决你的问题,请参考以下文章