2012-11-09 27 views
8

Mi chiedo come sia possibile 'tradurre' i caratteri in UTF-8 in l'equivalente ASCII più simile usando Javascript, proprio come fa l'Iconv in PHP.

Esempio:

ü diventa u
ó diventa o

Preferirei non usare una sostituzione, perché a) richiede un set completo di caratteri, che è un sacco di lavoro e b) Sarebbe difficile ottenere un set completo di personaggi, e non sarò mai sicuro se manchi uno o due.

+0

Quando si dice "UTF-8", ti * veramente * significa UTF-8? Come, una stringa di "caratteri" i cui elementi non sono in realtà caratteri, ma semplicemente unità di codice UTF-8 promosse a 16 bit? O intendi "Unicode", cioè una normale stringa UTF-16 JavaScript? – ruakh

+2

È possibile, ma non esiste un modo algoritmico per farlo oltre ad avere una mappa dai valori Unicode a qualunque ASCII "equivalente" tu (o qualcuno) pensi di essere appropriato. Si noti che una stringa UTF-8 può includere punti di codice per * molti * alfabeti molto diversi. – Pointy

+0

Il termine per questo è 'trascrizione' o 'traslitterazione', ci sono probabilmente alcune librerie là fuori. – Kapep

risposta

8

Come ha detto @Pointy, l'unica opzione è quella di mappare/sostituire i caratteri in base a un dizionario.

Troverete questo davvero utile: https://github.com/backbone-paginator/backbone.paginator/blob/a579796a30e583c4dfa09e0a86e4abd21e0b5b56/plugins/diacritic.js

+3

Ecco di più http://unicode.org/repos/cldr/trunk/common/transforms/Latin-ASCII.xml – Esailija

+0

Uoah @Esailija! È davvero completo! :) – alexandernst

+0

Mi rendo conto che questa è una vecchia risposta, ma il collegamento GitHub è rotto. – Jaruba

9

Il modo più semplice che ho trovato:

var str = "üó"; 
var combining = /[\u0300-\u036F]/g; 

console.log(str.normalize('NFKD').replace(combining, '')); 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize

+0

Unico inconveniente: fa parte di EcmaScript 6 e non funziona su tutti i browser –

+0

Un altro inconveniente: copre solo i marchi combinati, non la completa traslitterazione. – cmbuckley

+0

funziona davvero bene su node.js;);) – superhero