2012-07-25 13 views
7

Estoy comparando cadenas y tengo que reemplazar las diéresis en JS, pero parece que JS no reconoce las diéresis en las cadenas. El texto proviene de la base de datos y en el navegador las diéresis se muestran bien.Reemplazo de umlauts en JS

function replaceUmlauts(string) 
{ 
    value = string.toLowerCase(); 
    value = value.replace(/ä/g, 'ae'); 
    value = value.replace(/ö/g, 'oe'); 
    value = value.replace(/ü/g, 'ue'); 
    return value; 
} 

Como patrones de búsqueda que trataron:

  • "A", "O", "U"
  • /a /,/o /,/u/
  • "ä" "ö", "ü" (así la desesperación total de ;-))

para estar seguro, que no es una cuestión con la función de reemplazar Probé indexOf:

console.log(value.indexOf('ä')); 

Pero la salida con todos los patrones es: -1

así que supongo que es algún tipo de problema con la codificación, pero como he dicho en la página de las diéresis hacer apenas se ven bien .

¿Alguna idea? Esto parece tan simple ...

EDIT: Incluso si encontré mi respuesta, el problema no fue realmente resuelto "en la raíz" (la codificación). Esta es mi página de codificación:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 

La base de datos tiene: utf8_general_ci

parece totalmente bien para mí.

+1

Qué codificación utilizas en su base de datos y qué codificación usas en tu página web? – Marc

+0

¿Y cuál es la cuerda? Log it Sus enfoques funcionarían, pero como puede ver en su indexOf, su cadena no contiene un "ä". – Bergi

+0

'" bäg ".replace (/ ä/g," ae "); // ==> "baeg" ', entonces algo probablemente está apagado con tu codificación –

Respuesta

21

Hay que cerciorarse de que la codificación de la secuencia de comandos se especifica correctamente (en <script> etiqueta o en la página de encabezado/meta si está incrustado) o especificar símbolos con \uNNNN sintaxis eso siempre se resolverá inequívocamente con un punto de código Unicode específico.

Por ejemplo:

str.replace(/\u00e4/g, "ae") 

siempre reemplazará a una con AE, no importa qué codificación se establece para su página/escritura, incluso si no es correcta.

Éstos son los códigos necesarios para las lenguas germánicas:

// Ü, ü  \u00dc, \u00fc 
// Ä, ä  \u00c4, \u00e4 
// Ö, ö  \u00d6, \u00f6 
// ß  \u00df 
+0

Muchas gracias, esto funciona :-) Tengo codificación utf-8 en la página: que parece totalmente correcto para mí, y por eso sólo funciona con ese ... – SamiSalami

+0

Aquí están varios de los códigos: // U, U \t \t \ u00dc, \ u00fc // Ä, ä \t \t \ u00c4, \ u00e4 // Ö, ö \t \t \ u00d6, \ u00f6 // ß \t \t \ u00df –

+0

Å para los países nórdicos: // Å, å: \ u00c5, \ u00e5 –

1

Primero debe averiguar qué códigos de caracteres está tratando de reemplazar. Por ejemplo, dependiendo de la codificación de caracteres, los caracteres podrían estar en 8859, UTF-8 u otra cosa. También podrían ser símbolos de caracteres como "ä"

En lugar de adivinar, imprímalos.

Y tenga en cuenta que sus datos entrantes no pueden usar el mismo conjunto de caracteres/codificación de caracteres de manera consistente; debe verificar de dónde provienen los datos.

Mire los datos entrantes usando una cadena. charCodeAt

Compruebe el código de carácter antes del toLowerCase para asegurarse de que no le está cambiando las cosas. Deberá depurar paso a paso.

Finalmente, verifique la configuración del juego de caracteres en su editor para asegurarse de que su tipeado sea el que debería ser. Es posible que desee especificar que mediante el valor UTF-8 en lugar de escribir ä, ö, etc

+2

No importa lo que use como codificación en la página, en JS todo es Unicode y a-umlaut ** siempre ** tendrá exactamente mismo código –

+0

Creo que la codificación de mi documento (mi archivo en el editor) no importa, porque el texto proviene de una base de datos, por lo que solo la codificación en la base de datos y en las metaetiquetas html debería ser importante o no? Y su formateo de la función es bastante confuso, debería ser string.charCodeAt (0); (0 es la primera posición), pero realmente no pensé en eso y fue una buena pista, desafortunadamente no ayudó - el Unicode correcto fue devuelto antes de toLowerCase así como también después. – SamiSalami

6

He aquí una función que reemplaza caracteres más comunes para producir un Google URL amigable SEO:

function deUmlaut(value){ 
    value = value.toLowerCase(); 
    value = value.replace(/ä/g, 'ae'); 
    value = value.replace(/ö/g, 'oe'); 
    value = value.replace(/ü/g, 'ue'); 
    value = value.replace(/ß/g, 'ss'); 
    value = value.replace(/ /g, '-'); 
    value = value.replace(/\./g, ''); 
    value = value.replace(/,/g, ''); 
    value = value.replace(/\(/g, ''); 
    value = value.replace(/\)/g, ''); 
    return value; 
}