Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

147
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!