Estoy comparando dos nombres de archivo presumiblemente codificados de manera diferente, en Javascript, con la esperanza de encontrar coincidencias:
Al comparar la salida del registro en la consola de JavaScript, estos nombres de archivo se ven exactamente idénticos:
15 - Beschänkt und gsägnet - PLAYBACKVERSION.mp3 15 - Beschänkt und gsägnet - PLAYBACKVERSION.mp3Tenga en cuenta las diéresis alemanas.
Ahora, cuando solo copio y pego estas cadenas en Notepad ++ y habilito el editor hexadecimal, se ve así:
¿Cómo puedo comparar con seguridad esas dos cadenas? ¿Existe un método general de "descodificación" en Javascript que pueda manejar estas instancias? ¿O debería / debo adivinar cada codificación y luego compararla explícitamente?
Si tiene una String en JavaScript, es una secuencia de puntos de código Unicode. Algún componente ya ha decodificado los bytes que representan esas cadenas del ZIP o el plist en una secuencia de puntos de código.
Es decir, esta pregunta no se trata de codificaciones, sino de descomposición Unicode y formas de normalización.
Es posible codificar una ä en (al menos) dos formas diferentes en Unicode (ejemplos a continuación en Python debido a los resultados útiles).
>>> "ä".encode("UTF-8") b'\xc3\xa4' # two bytes >>> [ord(c) for c in "ä"] [228] >>> [unicodedata.name(c) for c in "ä"] ['LATIN SMALL LETTER A WITH DIAERESIS']o en la forma de normalización NFKD, tomando dos puntos de código y tres bytes en UTF-8.
>>> unicodedata.normalize("NFKD", "ä").encode("UTF-8") b'a\xcc\x88' # three bytes >>> [ord(c) for c in unicodedata.normalize("NFKD", "ä")] [97, 776] # two codepoints >>> [unicodedata.name(c) for c in unicodedata.normalize("NFKD", "ä")] ['LATIN SMALL LETTER A', 'COMBINING DIAERESIS'] Para resumir, en JavaScript, deberá llamar a String#normalize() para asegurarse de que las cadenas estén en la misma forma de normalización antes de intentar una comparación normal.
$ node Welcome to Node.js v16.6.1. Type ".help" for more information. > var a = '15 - Beschänkt und gsägnet - PLAYBACKVERSION.mp3'; undefined > var b = '15 - Beschänkt und gsägnet - PLAYBACKVERSION.mp3'; undefined > a.length 50 > b.length 48 > a === b false > a.normalize() === b.normalize() true >