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

186
Vistas
Los reemplazos de texto con empalme no funcionan con sonrisas (o caracteres multibyte)

Tengo un problema con un algoritmo de reemplazo complejo. Al final pude reducir el problema a este código mínimo:

 const input="test 🙄 hello test world" let start = 0 let output = [...input] const replacements = [] for (let end = 0; end <= input.length; end++) { const c = input[end] if (c == ' ') { if (start !== end) { const word = input.substring(start, end).toLowerCase() if (word == 'test') { replacements.push({start, length:(end - start), text:'REPLACEMENT'}) } } start = end + 1 } } for(let i=replacements.length-1;i>=0;i--) { output.splice(replacements[i].start, replacements[i].length, replacements[i].text) } console.log(output.join(''))

Mi entrada es "test 🙄 hello test world" y el resultado esperado sería "REPLACEMENT 🙄 hello REPLACEMENT world" , pero en realidad es "REPLACEMENT 🙄 hello tREPLACEMENTworld" . Puedo recordar de la API de Twitter que JavaScript tiene una forma extraña de manejar posiciones de bytes e índices de caracteres. Entonces, el problema es causado por el emoticón.

¿Cómo puedo arreglar mi código para que el reemplazo funcione como se esperaba? Pregunta adicional ¿por qué sucede eso?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Bueno, eso fue rápido:

 const input="test 🙄 hello test world" let start = 0 let output = [...input] const replacements = [] for (let end = 0; end <= output.length; end++) { const c = output[end] if (c == ' ') { if (start !== end) { const word = output.slice(start, end).join('').toLowerCase() if (word == 'test') { replacements.push({start, length:(end - start), text:'REPLACEMENT'}) } } start = end + 1 } } for(let i=replacements.length-1;i>=0;i--) { output.splice(replacements[i].start, replacements[i].length, replacements[i].text) } console.log(output.join(''))

Cuando uso la matriz de salida como entrada, los índices funcionan como se esperaba y mi reemplazo funciona nuevamente. Sin embargo, le daré a cualquiera el estado aceptado que pueda explicar por qué se requiere ese cambio.

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