我正在尝试使用UTF-8编码编写XML文件,原始字符串可能包含“á”等无效字符,因此,我需要将这些无效字符更改为有效字符。
我知道有一种编码方法可以采用例如字符á
并将其转换为字符组á
。
我试图用C#来实现这个目标,但我没有成功。我正在使用Encoding.UTF8函数,但我只以sema字符结尾(即:á)或'?'字符。
那么,你知道吗?是用C#??
来实现这个角色变化的正确方法感谢您的时间和帮助:)
LLORENS
答案 0 :(得分:5)
您可以使用任何一种方法。
以下是使用C#编码XML的4种方法:
这很难看,但确实有效。请注意Replace("&", "&")
必须是第一个替换,因此我们不会替换其他已经转义过的&。
string xml = "<node>it's my \"node\" & i like it<node>";
encodedXml = xml.Replace("&","&").Replace("<","<").Replace(">",">").Replace("\"", """).Replace("'", "'");
// RESULT: <node>it's my "node" & i like it<node>
用于编码HTML,但HTML是XML的一种形式,因此我们也可以使用它。主要用于ASP.NET应用程序。请注意,HtmlEncode不会对撇号(')进行编码。
string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = HttpUtility.HtmlEncode(xml);
// RESULT: <node>it's my "node" & i like it<node>
在Windows窗体或控制台应用程序中,我使用此方法。如果没有别的东西它可以保存我,包括我的项目中的System.Web参考,它编码所有5个字符。
string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = System.Security.SecurityElement.Escape(xml);
// RESULT: <node>it's my "node" & i like it<node>
使用XmlTextWriter,您不必担心转义任何内容,因为它会在需要的地方转义字符。例如,在属性中它不会转义撇号,而在节点值中它不会转义撇号和qoutes。
string xml = "<node>it's my \"node\" & i like it<node>";
using (XmlTextWriter xtw = new XmlTextWriter(@"c:\xmlTest.xml", Encoding.Unicode))
{
xtw.WriteStartElement("xmlEncodeTest");
xtw.WriteAttributeString("testAttribute", xml);
xtw.WriteString(xml);
xtw.WriteEndElement();
}
// RESULT:
/*
<xmlEncodeTest testAttribute="<node>it's my "node" & i like it<node>">
<node>it's my "node" & i like it<node>
</xmlEncodeTest>
*/
答案 1 :(得分:4)
á不是“无效”字符。它有一个UTF-8编码(字节195和161),尼克是正确的,如果你正确构造一切,这将是透明的。
答案 2 :(得分:1)
private static string Escape(string content)
{
var sb = new StringBuilder();
var settings = new XmlWriterSettings
{
ConformanceLevel = ConformanceLevel.Fragment
};
using (var xmlWriter = XmlWriter.Create(sb, settings))
xmlWriter.WriteString(content);
return sb.ToString();
}
答案 3 :(得分:0)
这正是您所需要的: (见http://www.codeproject.com/Articles/20255/Full-HTML-Character-Encoding-in-C)
//for example this transforms "čas" to "čas"
public static string HtmlEncode(string text)
{
char[] chars = HttpUtility.HtmlEncode(text).ToCharArray();
StringBuilder result = new StringBuilder(text.Length + (int)(text.Length * 0.1));
foreach (char c in chars)
{
int value = Convert.ToInt32(c);
if (value > 127)
result.AppendFormat("&#{0};", value);
else
result.Append(c);
}
return result.ToString();
}