2011-04-30 20 views
5

Tengo un problema con el siguiente código:XamlReader.Parse lanza el "carácter no válido en la codificación dada"

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

El xaml correspondiente, en la que aparece un problema:

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

durante el análisis de este xaml consigo la excepción:

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() 

archivo XAML guardado como UTF-8

¿Alguien sabe cómo puedo cargar este xaml sin tales problemas? ¡Gracias de antemano!

PD: Bien, he encontrado el origen del problema.

La forma correcta de cargar xaml es usar el método XamlReader.Load en lugar del XamlReader.Parse. En mi caso parece como:

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

¡Gracias a todos!

+0

¿Estás seguro de que se codificación UTF-8? –

+0

Sí, he intentado guardar este archivo como utf-8 con BOM, y sin él también. En ambos casos, obtuve el mismo resultado. – basilkot

+0

Y cuando muestro la secuencia de lectura a través del visualizador VS, no tiene ningún problema. Todos los personajes son correctos. – basilkot

Respuesta

4

Tuve el mismo problema con los caracteres umlaut alemanes. Creo que hay un error en .NET Framework. Trate de usar esta función en lugar de XamlReader.Parse (contenido, contexto):

public static object Parse(string xamlText, ParserContext parserContext) 
{ 
    return System.Windows.Markup.XamlReader.Load((Stream) new MemoryStream(Encoding.UTF8.GetBytes(xamlText)), parserContext); 
} 
Cuestiones relacionadas