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?
Respuesta
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.
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
.
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
@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. –
@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
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é.
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
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
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. –
- 1. pitón: comparar dos cadenas
- 2. str_replace() en cadenas multibyte peligroso?
- 3. ¿Comparar cadenas de dos bytes [] de utf-8 es lo mismo que comparar dos cadenas de unicode?
- 4. Smalltalk - Comparar dos cadenas para la igualdad
- 5. Rubí comparar dos cadenas porcentaje de similitud
- 6. ¿Puedo usar COUNTIF en dos columnas para comparar valores?
- 7. Comparar dos cadenas y obtener la diferencia
- 8. Cómo comparar caracteres en dos CharSequences
- 9. Javascript para comparar dos fechas, desde cadenas, begin <= end
- 10. RegEx: Comparar dos cadenas para encontrar Alliteration y Assonance
- 11. ¿Cuál es la función adecuada para comparar dos cadenas de estilo C?
- 12. Detectar caracteres chinos (multibyte) en la cadena
- 13. comparar dos cadenas en PHP y muestran diferencias de carácter
- 14. memcmp intrínseco
- 15. Regex para eliminar caracteres no alfanuméricos de cadenas UTF8
- 16. PHP: ¿la función implode() es segura para cadenas multibyte?
- 17. ¿Cómo puedo usar el operador LIKE en una lista de cadenas para comparar?
- 18. Cómo comparar 2 cadenas que contienen los mismos caracteres
- 19. C o C++. ¿Cómo comparar dos cadenas dadas char * punteros?
- 20. Comparar dos archivos
- 21. equivalente de memcmp() en Java?
- 22. ¿Cómo comparar cadenas con Xpath 1.0?
- 23. Comparar cadenas por envoltorios SSE4
- 24. ¿Cómo puedo saber si mi sistema Oracle está configurado para admitir caracteres Unicode o multibyte?
- 25. ¿Cómo puedo saber si una cadena contiene caracteres multibyte en Javascript?
- 26. ¿Cómo puedo comparar dos listas en Groovy
- 27. Cómo comparar dos cadenas si no son iguales
- 28. Manejo de caracteres multibyte (no ASCII) en C
- 29. C# compare dos cadenas para palabras coincidentes
- 30. ¿Cómo puedo comparar dos cadenas de tiempo en el formato HH: MM: SS?
Depende de si las dos cadenas usan la misma codificación. –