2012-06-15 24 views
6

¡Estoy encontrando una manera de contar el carácter especial que forma por más de un personaje pero no encontré ninguna solución en línea!Contando el carácter especial UTF-8

Por ej. Quiero contar la cadena "வாழைப்பழம". En realidad, consta de 6 caracteres tamil, pero tiene 9 caracteres en este caso cuando utilizamos la forma normal de encontrar la longitud. Me pregunto si el tamil es el único tipo de codificación que causará este problema y si hay una solución para esto. Actualmente estoy tratando de encontrar una solución en C#.

Gracias de antemano =)

Respuesta

9

Uso StringInfo.LengthInTextElements:

var text = "வாழைப்பழம"; 
Console.WriteLine(text.Length);        // 9 
Console.WriteLine(new StringInfo(text).LengthInTextElements); // 6 

La explicación de este comportamiento se puede encontrar en la documentación de String.Length:

Los Longitud retornos de propiedad el número de objetos Char en esta instancia, no el número de caracteres Unicode. La razón es que un carácter Unicode podría estar representado por más de un Char. Use la clase System.Globalization.StringInfo para trabajar con cada carácter Unicode en lugar de cada Char.

+0

Gracias! ¡Esto es lo que estoy buscando! ¡Te amo! = X – Cheng

3

Una pequeña crítica de menor importancia: string s en el uso de .NET UTF-16, no UTF-8


Cuando se habla acerca de la longitud de una cadena, hay varias cosas diferentes que usted podría media:

  1. Longitud en bytes. & # x2003; Esta es la vieja forma de ver las cosas en C, por lo general.
  2. Longitud en puntos de código Unicode. & # x2003; Esto lo acerca más a los tiempos modernos y debería ser la forma en que se tratan las longitudes de las cuerdas, excepto que no lo es.
  3. Longitud en UTF-8/UTF-16 código unidades. & # x2003; Esta es la interpretación más común, que se deriva de 1. Ciertos caracteres toman más de una unidad de código en esas codificaciones, lo que complica las cosas si no lo espera.
  4. Recuento de "caracteres" visibles (grafemas). & # x2003; Esto es lo que las personas quieren decir cuando dicen caracteres o longitud de una cadena.

En el caso de que su confusión se deriva de la diferencia entre 4 y 3. 3. es lo que utiliza C#, 4. es lo que espera. Los scripts complejos como Tamil usan ligaduras y signos diacríticos. Las ligaduras son contracciones de dos o más caracteres adyacentes en un solo glifo; en su caso, ழை es una ligadura de ழ y ை - la última de las cuales cambia la apariencia del primero; வா es también una ligadura Diacríticos son adornos alrededor de una letra, p. el acento en à o en el punto sobre ப்.

Los dos casos que he mencionado ambos dan como resultado un único grafema (lo que percibe como un carácter único), pero ambos necesitan dos caracteres reales cada uno. Entonces terminas con tres puntos de código más en la cadena.

Una cosa a tener en cuenta: para su caso, la distinción entre 2. y 3. es irrelevante, pero en general debe tenerlo en cuenta.

+1

+1, buen análisis. – Heinzi

Cuestiones relacionadas