2012-06-16 13 views
7

Esto debe ser un error .NET, ¿verdad?¿Por qué veo este comportamiento inesperado de StartsWith de .NET?

"KonNy".StartsWith("Kon") devuelve falso, mientras que "KonNy".StartsWith("Ko") y "KonN".StartsWith("Kon") devuelven verdadero.

¿Hay algo que me falta aquí?

+7

¿Es usted por casualidad un húngaro? La intercalación húngara explicaría el fenómeno (aunque no sé si .NET 'StartsWith' implementa los detalles de la intercalación), dado que 'nny' es una letra única. – Amadan

+0

Lo más probable es que tenga algunos caracteres no estándar en su cadena – Filip

+0

Amadan, gran observación. ¿Te importa responder para poder aceptarlo? – ggPeti

Respuesta

14

repetida de:

No sé .NET específicamente, pero sospechaba que podría observar este fenómeno si StartsWith siguió un cotejo donde nny era una sola letra, como la húngara. Si estoy en lo cierto y si cambias tu colación a una neutral, tu "error" desaparecería. :)

9

EDITAR: Este es un problema de sensibilidad cultural, que solo se muestra en las culturas húngaras. Repro:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main()   
    { 
     foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
     { 
      if (!"KonNy".StartsWith("Kon", false, culture)) 
      { 
       Console.WriteLine(culture); 
      } 
     } 
    } 
} 

Salida:

hu 
hu-HU 

Si desea una comparación insensible a la cultura, especifique StringComparison.Ordinal según la respuesta de usr.

+1

Así es exactamente como lo reproduje fuera del entorno en el que lo encontré. Devuelto falso. Lo curioso es que en PowerShell devolvió verdadero. – ggPeti

+1

Eso solo refuta su reclamo por su cultura, y como usted sabe, las culturas pueden ser raras. Debes iterar sobre todas las culturas en un ciclo para verificar. – CodesInChaos

+0

@ggPeti: Bueno, el programa que he escrito imprime True. ¿Realmente * imprime 'False' para usted? –

1

Sospecho que su cadena tiene caracteres de ancho cero o no imprimibles. El espacio de caracteres Unicode contiene algunas sorpresas desagradables y poco intuitivas. Intenta llamar a ToCharArray en tus literales de cadena e inspecciona los códigos de char resultantes.

Intenta llamar a StartWith con StringComparison.Ordinal para asegurarte de que tu cultura no interfiera.

Cuestiones relacionadas