2014-05-05 18 views
6

Come posso combinare un carattere seguito da un "accento combinato" in un singolo carattere?Come posso combinare un carattere seguito da un "accento combinato" in un singolo carattere?

Sto prendendo una frase che l'utente inserisce in una pagina Web e la invia ad un dizionario francese-inglese. A volte la ricerca nel dizionario fallirebbe perché ci sono due rappresentazioni per i caratteri più accentati. Per esempio:

  • E può essere fatto in un singolo carattere: \xE9 (alfabeto latino e con acuta).
  • Ma è anche rappresentato da due caratteri: e + \u0301 (combinazione di accento acuto).

Desidero sempre inviare il precedente (carattere singolo) al dizionario.

In questo momento, lo sto sostituendo ogni occorrenza di due caratteri che trovo con il singolo carattere equivalente. Ma esiste un modo più semplice (vale a dire una riga) per farlo, sia in JavaScript che nel browser quando viene recuperato dal campo di input?

function translate(phrase) { 
    // Combine accents into a single accented character, if necessary. 
    var TRANSFORM = [ 
     // Acute accent. 
     [/E\u0301/g, "\xC9"], // É 
     [/e\u0301/g, "\xE9"], // é 

     // Grave accent. 
     [/a\u0300/g, "\xE0"], // à 
     [/e\u0300/g, "\xE8"], // è 
     [/u\u0300/g, "\xF9"], // ù 

     // Cedilla (no combining accent). 

     // Circumflex. 
     [/a\u0302/g, "\xE2"], // â 
     [/e\u0302/g, "\xEA"], // ê 
     [/i\u0302/g, "\xEE"], // î 
     [/o\u0302/g, "\xF4"], // ô 
     [/u\u0302/g, "\xFB"], // û 

     // Trema. 
     [/e\u0308/g, "\xEB"], // ë 
     [/i\u0308/g, "\xEF"], // ï 
     [/u\u0308/g, "\xFC"] // ü 

     // oe ligature (no combining accent). 
    ]; 
    for (var i = 0; i < TRANSFORM.length; i++) 
     phrase = phrase.replace(TRANSFORM[i][0], TRANSFORM[i][1]); 

    // Do translation. 
    ... 
} 
+0

È possibile utilizzare [sostituire] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects% 2FString% 2Freplace) con la funzione e semplificare la corrispondenza in una singola espressione regolare ('. [\\ u0300 \\ u0302]') e controllare la corrispondenza con il dizionario di tutte le scelte ... –

risposta

8

questo si chiama normalization, sembra che si desidera normalizzazione NFC:

personaggi vengono scomposti e poi ricomposti per equivalenza canonica.

In altre parole, sostituisce qualsiasi carattere combinato con l'equivalente di singolo carattere.

Questa è costruito in ECMAScript 6 come String.prototype.normalize, quindi se si sta bene solo sostenendo i browser più recenti si può solo fare il seguente:

phrase = phrase.normalize('NFC'); 

Per sostenere i vecchi browser così, sembra che questa biblioteca fa quello si vuole:
https://github.com/walling/unorm

Uso sarebbe phrase = UNorm.nfc(phrase).

+0

Grazie! Ho avuto problemi a cercare una risposta perché non sapevo come chiamarla. –

Problemi correlati