2012-06-05 6 views
5

¡Encontré un boleto en nuestro rastreador de problemas que uno de los clientes informa un error que un texto está incompleto! Tenemos un programa de conversión de texto de un sistema heredado (IBM AS400) a uno moderno. ¡Lo rastreé y encontré un comportamiento desconocido en mi código!String.Trim() elimina más de lo necesario?

Primera ver esto: bug-full state

Como se puede ver, hay dos carbón antes del primer espacio (char32), pero cuando quito Trim(), el resultado es:

bug-free state

Sí, Trim() elimina char160 desde el principio! ¿Qué pasó que Trim() funciona más de lo necesario? Nota: ambas imágenes se capturan en el mismo estado de prueba.

+0

es CHAR 160 no un espacio en su codificación? o tal vez estás usando la página de códigos incorrecta? – Vlad

+0

es un personaje correcto que conozco. –

+0

esto significa que su página de códigos está equivocada, porque en cp1256 este carácter _es_ un espacio en blanco. – Vlad

Respuesta

15

160 es un NBSP (espacio sin interrupción) y de acuerdo con la documentación, Trim eliminará todos los espacios en blanco. 160 se clasifica en Unicode como espacios en blanco.

En su lugar, puede llamar al Trim(' ').

4

Trim() elimina los caracteres de espacio en blanco iniciales y finales, y eso es what it is supposed to do.

char 160 es un espacio sin interrupciones, que es uno de los espacios en blanco que elimina.

2

Recortar elimina todo el espacio en blanco, no solo los espacios. Si char 160 es un espacio en blanco en la página de códigos 1256, Trim lo eliminará.

El código siguiente muestra que el 32 y el 160 son los espacios en blanco en la página de códigos 1256:

 var chars = new byte[] {32,160,164 }; 
     var enc=Encoding.GetEncoding(1256); 
     var str=enc.GetString(chars); 
     foreach (var character in str) 
     { 
      Console.WriteLine("{0}:{1}", character, Char.IsWhiteSpace(character)); 
     } 
     Console.ReadKey(); 

devoluciones:

 True 
     True 
     False 
Cuestiones relacionadas