XamlReader.Parse выдает «Недопустимый символ в данной кодировке» - PullRequest
5 голосов
/ 30 апреля 2011

У меня проблема со следующим кодом:

using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
    var content = reader.ReadToEnd();
    ParserContext context = new ParserContext()
    {
        BaseUri = new Uri(Configuration.SkinsFolder)
        //,XmlLang = "utf-8" // I have tried with this parameter and without it
    };
    var result = XamlReader.Parse(content, context);
    return result;
}

Соответствующий xaml, где возникает проблема:

...
<TextBlock>русская надпись</TextBlock>
<TextBlock Text="קח מספר" />
...

Во время разбора этого xaml я получаю исключение:

Invalid character in the given encoding. Line 76, position 167.
   at System.Windows.Markup.XamlReaderHelper.RethrowAsParseException(String keyString, Int32 lineNumber, Int32 linePosition, Exception innerException)
   at System.Windows.Markup.XamlReaderHelper.Read(XamlNode& xamlNode)
   at System.Windows.Markup.XamlParser.ReadXaml(Boolean singleRecordMode)
   at System.Windows.Markup.XamlParser._Parse()
   at System.Windows.Markup.XamlParser.Parse()

Файл Xaml сохранен как utf-8

Кто-нибудь знает, как я могу загрузить этот xaml без таких проблем? Заранее спасибо!

PS: ОК, я нашел источник проблемы.

Правильный способ загрузки xaml - использовать метод XamlReader.Load вместо XamlReader.Parse. В моем случае это выглядит так:

using (Stream stream = new FileStream(source, FileMode.Open))
{
    ParserContext context = new ParserContext()
    {
        BaseUri = new Uri(Configuration.SkinsFolder)
    };
    var result = XamlReader.Load(stream, context);
    return result;
}

Спасибо всем!

1 Ответ

4 голосов
/ 30 апреля 2013

У меня была такая же проблема с немецкими умлаутами. Я думаю, что есть ошибка в .NET Framework. Попробуйте использовать эту функцию вместо XamlReader.Parse (content, context):

public static object Parse(string xamlText, ParserContext parserContext)
{
  return System.Windows.Markup.XamlReader.Load((Stream) new MemoryStream(Encoding.UTF8.GetBytes(xamlText)), parserContext);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...