Как кодировать 'а' в '& # 225' с помощью C # ?? (UTF-8) - PullRequest
0 голосов
/ 05 июня 2010

Я пытаюсь написать файл XML с кодировкой UTF-8, и исходная строка может содержать недопустимые символы, такие как «á», поэтому мне нужно заменить эти недопустимые символы на допустимые.

Я знаю, что существует метод кодирования, который принимает, например, символ á и преобразует его в группу символов á.

Я пытаюсь добиться этого с помощью C #, но у меня ничего не получается. Я использую функции Encoding.UTF8, но я заканчиваю только знаком sema (т.е.:) или '?' характер.

Итак, знаете ли вы, как правильно добиться этого изменения символа с помощью C # ??

Спасибо за ваше время и помощь:)

LLORENS

Ответы [ 4 ]

5 голосов
/ 05 июня 2010

Вы можете использовать любой один метод.

Вот 4 способа кодирования XML в C #:

  1. string.Replace () 5 раз

Это ужасно, но это работает. Обратите внимание, что 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 ()

Используется для кодирования 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 ()

В Windows Forms или консольных приложениях я использую этот метод. Если ничего другого, это спасает меня, включая ссылку 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

Используя XmlTextWriter, вам не нужно беспокоиться об экранировании чего-либо, поскольку оно экранирует символы, где это необходимо. Например, в атрибутах он не экранирует апострофы, а в значениях узлов он не экранирует апострофы и квоты.

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]

4 голосов
/ 05 июня 2010

не является «недействительным» символом. Он имеет кодировку UTF-8 (байты 195 и 161), и Ник прав, если вы все правильно построите, это будет прозрачно.

1 голос
/ 17 октября 2012
    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();
    }
0 голосов
/ 07 февраля 2012

Это именно то, что вам нужно: (найдено на 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...