如何用C#将'á'编码为'á'? (UTF8)

时间:2010-06-05 15:16:36

标签: c# xml encoding utf-8

我正在尝试使用UTF-8编码编写XML文件,原始字符串可能包含“á”等无效字符,因此,我需要将这些无效字符更改为有效字符。

我知道有一种编码方法可以采用例如字符á并将其转换为字符组á

我试图用C#来实现这个目标,但我没有成功。我正在使用Encoding.UTF8函数,但我只以sema字符结尾(即:á)或'?'字符。

那么,你知道吗?是用C#??

来实现这个角色变化的正确方法

感谢您的时间和帮助:)

LLORENS

4 个答案:

答案 0 :(得分:5)

您可以使用任何一种方法。

以下是使用C#编码XML的4种方法:

  1. string.Replace()5次
  2. 这很难看,但确实有效。请注意Replace("&", "&")必须是第一个替换,因此我们不会替换其他已经转义过的&。

    string xml = "<node>it's my \"node\" & i like it<node>";
    encodedXml = xml.Replace("&","&amp;").Replace("<","&lt;").Replace(">","&gt;").Replace("\"", "&quot;").Replace("'", "&apos;");
    
    // RESULT: &lt;node&gt;it&apos;s my &quot;node&quot; &amp; i like it&lt;node&gt;
    
    1. System.Web.HttpUtility.HtmlEncode()
    2. 用于编码HTML,但HTML是XML的一种形式,因此我们也可以使用它。主要用于ASP.NET应用程序。请注意,HtmlEncode不会对撇号(')进行编码。

      string xml = "<node>it's my \"node\" & i like it<node>";
      string encodedXml = HttpUtility.HtmlEncode(xml);
      
      // RESULT: &lt;node&gt;it's my &quot;node&quot; &amp; i like it&lt;node&gt;
      
      1. System.Security.SecurityElement.Escape()
      2. 在Windows窗体或控制台应用程序中,我使用此方法。如果没有别的东西它可以保存我,包括我的项目中的System.Web参考,它编码所有5个字符。

        string xml = "<node>it's my \"node\" & i like it<node>";
        string encodedXml = System.Security.SecurityElement.Escape(xml);
        
        // RESULT: &lt;node&gt;it&apos;s my &quot;node&quot; &amp; i like it&lt;node&gt;
        
        1. System.Xml.XmlTextWriter
        2. 使用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="&lt;node&gt;it's my &quot;node&quot; &amp; i like it&lt;node&gt;">
              &lt;node&gt;it's my "node" &amp; i like it&lt;node&gt;
          </xmlEncodeTest>
          */
          

          [http://weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape-an-XML-string-in-C.aspx]

答案 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 "&#269;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();
    }