我有一个文件上传控件,可以上传xml文档。
XML文件将以unicode格式编码。我想将它们转换为UTF8,因此它们可以呈现为正确的xml文件。
我将上传的文件作为十六进制字符串保存在隐藏字段中,并将其发送到通用处理程序。我想要的是一个我可以创建一个xml的结果。目前我的字符串看起来像这样:
"??<\0?\0x\0m\0l\0 \0v\0e\0r\0s\0i\0o\0n\0=\0\"\01\0.\00\0\"\0 \0e\0n\0c\0o\0d\0i\0n\0g\0=\0\"\0I\0S\0O\0-
而不是
<?xml version="1.0".. etc
代码:
if (fileUpload.PostedFile.ContentType == "text/xml")
{
Stream inputstream = fileUpload.PostedFile.InputStream;
byte[] streamAsBytes = (ConvertStreamToByteArray(inputstream));
string stringToSend = BitConverter.ToString(streamAsBytes);
xmlstream.Value = stringToSend;
sendXML.Visible = true;
infoLabel.Text = "<b>Selected XML: </b>" + fileUpload.PostedFile.FileName;
}
handler.ashx:
if (HttpContext.Current.Request.Form["xmldata"] != null)
{
HttpContext.Current.Response.ContentType = "text/xml";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
string xmlstring = HttpContext.Current.Request.Form["xmldata"];
byte[] data = xmlstring.Split('-').Select(b => Convert.ToByte(b, 16)).ToArray();
string complete = System.Text.ASCIIEncoding.ASCII.GetString(data);
XmlDocument doc = new XmlDocument();
doc.LoadXml(complete);
HttpContext.Current.Response.Write(doc.InnerXml);
}
谢谢!
答案 0 :(得分:3)
你真的应该这样做并不清楚。 XML文件可以声明自己的编码,看起来你的声明是以“ISO”开头的编码(这就是你给我们的数据停止的地方)。那可能不是 UTF-8。
基本上,我认为您不应该将数据视为handler.ashx中的文本。只需让XmlDocument
从流中解析它。它并不是很清楚完全你的上传代码是如何发送数据的,但是你应该尽量少把它弄乱。
可能如果你改变了这个,你的当前代码实际上会正常工作:
string complete = System.Text.ASCIIEncoding.ASCII.GetString(data);
XmlDocument doc = new XmlDocument();
doc.LoadXml(complete);
到此:
XmlDocument doc = new XmlDocument();
doc.Load(new MemoryStream(data));
然而,十六进制部分非常难看。如果你真的需要将二进制数据表示为文本,我强烈建议使用Base64而不是hex:
string text = Convert.ToBase64String(binary);
...
byte[] binary = Convert.FromBase64String(text);
...不需要单独转换每个字节并将字符串拆分为连字符等。