2012-09-13 812 views
18

Con el fin de depurar un problema en mi código, que han declarado las dos cadenas siguientes, suponiendo que serían equivalentes:Igualdad de cadenas: ¿Qué está pasando aquí?

String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
String newPrint = thumbprint.Trim().Replace(" ", "").ToUpper(); 

he descubierto que no son. Genial, esta es la fuente de mi problema. Sin embargo, estoy verificando las cosas en la ventana inmediata (en la línea que sigue a las declaraciones) y no entiendo qué está sucediendo. Aquí está la salida:

print 
"8A9B485ECDC56B6E0FD023D6994A57EEC49B0717" 
newPrint 
"‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717" 
String.Compare(print, newPrint); 
0 
print == newPrint 
false 
print.Equals(newPrint) 
false 

¿eh? ¿Por qué no son iguales?

edición:

necesito utilizar 'huella digital' como la base. Es una cadena ingresada por el usuario. Solo estoy usando 'newPrint' como una variable temporal para mantener el valor recortado/aumentado. imprimir es el resultado esperado.

+8

huella digital!= imprimir –

+5

Su primera variable es "imprimir", su segunda variable se basa en "huella digital", por lo que es muy posible que no sean equivalentes. ¿Es esto solo un error tipográfico? – BunjiquoBianco

+1

@DanielHilgarth ignora qué es la huella digital. no importa, mira la salida. – Erix

Respuesta

28

De hecho, no son equivalentes. Copié los dos valores y newPrint tiene una longitud de 41, mientras que print tiene una longitud de 40. El primer carácter de newPrint es un carácter con el valor ASCII 14. Es interesante que se haya transferido desde su ventana inmediata a SO a mi LINQPad.

print.Length 
40 
newPrint.Length 
41 
(sbyte)print[0] 
56 
(sbyte)newPrint[0] 
14 

Que en realidad no tiene nada que ver con sus Trim y Replace llamadas, pero con el hecho de que está utilizando en lugar de thumbprintprint como la base. Solo puedo suponer que thumbprint contiene ese caracter adicional. De dónde viene, no sé. Si cambiara su segunda línea para usar print en lugar de thumbprint, obtendría el resultado esperado.

+2

Ahh sí, ¡en realidad puedes verlo tomar 2 pulsaciones de flecha izquierda/derecha en VS para mover el cursor! – BunjiquoBianco

+0

Ya veo, gracias. aparentemente el characer es un 'Shift Out, juego de caracteres alternativo'. No tengo idea de lo que está haciendo allí ... – Erix

+3

ASCII 14 es el carácter "SO", que se utilizó originalmente para seleccionar diferentes conjuntos de caracteres. No estoy seguro de por qué diablos estaría apareciendo aquí ... –

18

Las cadenas que publicaste son no iguales. a hacer esto:

string val = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
string val1 = "‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
var bt = System.Text.Encoding.UTF8.GetBytes(val); 
var bt_1 = System.Text.Encoding.UTF8.GetBytes(val1); 

Usted verá que el segundo elemento de matriz contiene más de begining.

226 
128 
142 

después de esto 3 elementos contenidos iguales.

La razón String.Compare obras es causa:

La comparación utiliza la cultura actual para obtener específico de la cultura información, como reglas de la carcasa y el orden alfabético de caracteres individuales

+0

1 para la explicación de por qué String.Compare devuelve 0. –

0

Hay algo mal con la pregunta Si no, pl. Especifique el entorno completo, ya que lo intenté en MS .NET pero no en Mono. Pruebe este método: - consigo ningún error y la salida de la sentencia trace es

cadenas son iguales = True

void TestString() 
{ 
    String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
    String newPrint = print.Trim().Replace(" ", "").ToUpper(); 
    Trace.TraceInformation("Strings are equal = {0}", (print == newPrint) && (print.Equals(newPrint))); 
    Debug.Assert(print == newPrint); 
    Debug.Assert(print.Equals(newPrint)); 
} 
+4

Llega un poco tarde a la fiesta. Por favor, vea las otras dos respuestas para saber qué estaba pasando. –

Cuestiones relacionadas