codificar acentos c# .net .net-4.0 .net-core .net-4.6.1

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)

línea 121 :

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 .