Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

144
Vistas
Javascript: compare dos cadenas con una codificación realmente diferente

Estoy comparando dos nombres de archivo presumiblemente codificados de manera diferente, en Javascript, con la esperanza de encontrar coincidencias:

  • Un nombre de archivo es un nombre de archivo real , desde dentro de un zip sin archivar (usando https://stuk.github.io/jszip/ )
  • Un nombre de archivo es un nombre extraído de una bplist (formato de archivo de iOS desarchivado con https://github.com/joeferner/node-bplist-parser )

Análisis

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.mp3

Tenga en cuenta las diéresis alemanas.

Ahora, cuando solo copio y pego estas cadenas en Notepad ++ y habilito el editor hexadecimal, se ve así:

El texto anterior en hexadecimal

  • En el primer caso el A-Umlaut se codifica con 3 (tres) bytes
  • En el segundo caso, el A-Umlaut se codifica con solo 2 (dos) bytes.

Pregunta

¿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?

Nota

  • Estoy pidiendo específicamente una solución en javascript
  • Esta pregunta, Comparar cadenas con diferentes codificaciones , aunque similares, en realidad no se trata de codificar
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

¿Que esta pasando aqui?

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']

Responder

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 >
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda