2012-02-27 37 views
6

Estoy intentando escribir código para comparar dos cadenas. En windows puedo usar strcmp pero quiero escribir para cadena de caracteres multibyte para que sea compatible con todas las otras plataformas ¿Puedo usar memcmp? si no, entonces ¿hay alguna otra API que pueda usar o tengo que escribir mi propia API?¿Puedo usar memcmp dos cadenas de caracteres multibyte para comparar?

+3

Depende de si las dos cadenas usan la misma codificación. –

Respuesta

1

Si ambas cadenas usan la misma codificación, memcmp funcionará bien. Sin embargo, tenga en cuenta que los caracteres anchos son de diferentes tamaños en diferentes plataformas.

Si las cadenas utilizan codificaciones diferentes, necesitará una biblioteca como ICU para manejarlo.

2

Si las dos cadenas usan la misma codificación, puede usar memcmp. Si están usando UTF-8, incluso podría usar strcmp, ya que 0 no aparece en cadenas codificadas UTF-8. Otra opción es convertir sus cadenas a caracteres anchos usando mbstowcs.

+0

Esto tendrá falsos negativos: dos cadenas idénticas se pueden codificar en patrones de bytes diferentes. Necesita comparar con una función inteligente Unicode. – StilesCrisis

+0

@StilesCrisis: ¿Puedes dar un ejemplo de cómo cadenas idénticas pueden tener diferentes codificaciones UTF-8? O, para el caso, ¿cómo podría suceder esto con cualquier otra codificación de signo (como ISO 8859-1)? Hice el punto de que las cadenas necesitaban usar la misma codificación. –

+0

@Ted Hopp: con UTF-8, puedes codificar un personaje en forma demasiado larga (una secuencia que decodifica a un valor que debería usar una secuencia más corta: esta oración es de wikipedia). En este caso, memcmp devuelve una respuesta incorrecta, pero la función de comparación consciente UTF-8 devuelve la respuesta correcta ... – Malkocoglu

5

Tienes que tener cuidado. No soy un experto en codificaciones de bytes múltiples/Unicode, pero sé que con diacríticos a veces dos cadenas se pueden considerar iguales cuando sus bytes no son exactamente iguales. Se recomienda utilizar API probadas previamente, ya que las codificaciones de cadenas pueden ser bastante complicadas.

Ver the old new thing on case mapping. No puedo pensar en una referencia para los diacríticos, pero si lo hago lo publicaré.

+0

Esto es correcto. En algunos casos, un 'memcmp' funcionará. Para una corrección del 100%, y especialmente si se trata de Unicode en cualquier forma, 'memcmp' no funcionará. Incluso los caracteres simples como 'é' pueden representarse de más de una manera, ya sea como 'é' (un carácter Unicode) o como' '' combinado con' e' (en dos caracteres Unicode). La mayoría de las veces, estos no se mezclan y combinan, por lo que es posible que no veas ningún problema al principio, pero eventualmente te morderá. – StilesCrisis

+0

Otra forma en que las cadenas se podrían 'considerar' iguales, pero no con bytes iguales, es si su comparación no es invariante. En este caso, debe realizar lo que se denomina plegado de casos, que permite comparar mayúsculas, minúsculas, mayúsculas y glifos invariantes de mayúsculas y minúsculas (que, como se indicó anteriormente, podría estar en la memoria representada como puntos de código múltiple ... o no)) – Bingo

+0

Igual después de la normalización no es lo mismo que igual. Ese es el objetivo de la normalización. OP pregunta si dos cadenas de cadenas son iguales, no si son equivalentes. –

Cuestiones relacionadas