c# - acentos - ¿Por qué Uri.TryCreate arroja NRE cuando url contiene caracteres turcos?
encoding utf 8 acentos c# (1)
Me encontré con una situación interesante en la que obtengo NRE
del método Uri.TryCreate
cuando se supone que devuelve false
.
Puede reproducir el problema como a continuación:
Uri url;
if (Uri.TryCreate("http:Ç", UriKind.RelativeOrAbsolute, out url))
{
Console.WriteLine("success");
}
Supongo que está fallando durante el análisis, pero cuando intento "http:A"
por ejemplo, devuelve true
y lo analiza como URL relativa. Incluso si falla en el análisis, debería simplemente dar como resultado false
, ¿cuál podría ser el problema aquí? Esto parece un error en la implementación porque la documentación no menciona ninguna excepción en este método.
El error ocurre en .NET 4.6.1 pero no 4.0
Este es un error en el framework .NET. Puede abrir un ticket en MicrosoftConnect.
La excepción se planteará en este método
void Systen.Uri.CreateUriInfo(System.Uri.Flags cF)
en la línea 2290 (inspeccionar la fuente de referencia ) ejecutando la siguiente instrucción:
// This is NOT an ImplicitFile uri
idx = (ushort)m_Syntax.SchemeName.Length;
En este momento, el objeto m_Syntax
será null
, porque durante el análisis, se descartará.
Método
void InitializeUri(ParsingError err, UriKind uriKind, out UriFormatException e)
if (m_Syntax.IsSimple)
{
if ((err = PrivateParseMinimal()) != ParsingError.None)
{
if (uriKind != UriKind.Absolute && err <= ParsingError.LastRelativeUriOkErrIndex)
{
// RFC 3986 Section 5.4.2 - http:(relativeUri) may be considered a valid relative Uri.
m_Syntax = null; // convert to relative uri
e = null;
m_Flags &= Flags.UserEscaped; // the only flag that makes sense for a relative uri
}
// ...
}
// ...
}
El método PrivateParseMinimal()
devuelve ParsingError.BadAuthority
y uriKind == UriKind.RelativeOrAbsolute
según su especificación.
El método PrivateParseMinimal()
busca cualquiera de las siguientes secuencias de caracteres: "//", "/", "/ /", "/". Y dado que no hay tales secuencias en su cadena de entrada, se ParsingError.BadAuthority
un código ParsingError.BadAuthority
.