.net Parse抛出;给定编码中的无效字符";

.net Parse抛出;给定编码中的无效字符";,.net,wpf,xaml,.net,Wpf,Xaml,我对以下代码有问题: using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { var content = reader.ReadToEnd(); ParserContext context = new ParserContext() { BaseUri = new Uri(Configuration.SkinsFolder) //,XmlLang = "

我对以下代码有问题:

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文件另存为utf-8

有人知道我如何加载这个xaml而不出现这样的问题吗? 提前谢谢

好的,我已经找到了问题的根源

加载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;
}

谢谢大家

我对德国乌姆劳特人也有同样的问题。我认为.NET框架中有一个bug。尝试使用此函数而不是XamlReader.Parse(内容、上下文):


你确定它是UTF-8编码的吗?是的,我试过用BOM将这个文件保存为UTF-8,也不保存。在这两种情况下,我得到了相同的结果。当我通过VS watcher显示读取字符串时,它没有任何问题。所有字符都是正确的。我认为这里的问题不是编码,而是XamlParser。如果您使用正确的编码给它一个已经从文件中读入的字符串,那么基本上XamlParser必须禁止在这些位置使用这些字符。我不认为这是编码,这是验证。这可能是因为你不允许使用这种字符,也可能是类中的错误。我假设您已经验证了
.ReadToEnd
后面的字符串,并检查了它在该点上是否确实包含正确的字符,并且没有损坏?是的,在.ReadToEnd后面的字符串是正确的。也许问题在于当前的文化?当我在具有希伯来文化的机器上运行此代码时,我得到了第二个字符串的消息,但第一个字符串(俄语字符)显示为问号。
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;
}
public static object Parse(string xamlText, ParserContext parserContext)
{
  return System.Windows.Markup.XamlReader.Load((Stream) new MemoryStream(Encoding.UTF8.GetBytes(xamlText)), parserContext);
}