2012-11-09 75 views
8

Zastanawiam się, jak można "tłumaczyć" znaki w UTF-8 najbliższy odpowiednik ASCII za pomocą Javascript, podobnie jak Iconv doest w PHP.

Przykład:

ü staje u
ó staje się o

Wolałbym nie używać zastąpić, ponieważ a) nie wymaga kompletnego zestawu znaków, co jest dużo pracy i b) Trudno byłoby mi uzyskać kompletny zestaw postaci i nigdy nie będę pewien, czy brakuje mi jednego czy dwóch.

+0

Kiedy mówisz "UTF-8", czy * naprawdę * oznacza UTF-8? Jak ciąg znaków "znaków", których elementy w rzeczywistości nie są znakami, a jedynie jednostki kodowe UTF-8 promowane do 16 bitów? Czy masz na myśli "Unicode", czyli normalny ciąg znaków JavaScript UTF-16? – ruakh

+2

Jest to możliwe, ale nie ma algorytmicznego sposobu, aby to zrobić, oprócz posiadania mapy od wartości Unicode do tego, co "równoważne" ASCII, które ty (lub ktoś) uważasz za stosowne. Zauważ, że ciąg znaków UTF-8 może zawierać punkty kodowe dla * wielu * bardzo różnych alfabetów. – Pointy

+0

Termin ten to "transkrypcja" lub "transliteracja", prawdopodobnie istnieją pewne biblioteki. – Kapep

Odpowiedz

8

Jak powiedział @Pointy, jedyną opcją jest mapowanie/zamiana znaków zgodnie ze słownikiem.

Musisz znaleźć to naprawdę przydatne: https://github.com/backbone-paginator/backbone.paginator/blob/a579796a30e583c4dfa09e0a86e4abd21e0b5b56/plugins/diacritic.js

+3

Oto więcej http://unicode.org/repos/cldr/trunk/common/transforms/Latin-ASCII.xml – Esailija

+0

Uoah @Esailija! To naprawdę kompletne! :) – alexandernst

+0

Rozumiem, że jest to stara odpowiedź, ale link do GitHub jest zepsuty. – Jaruba

9

Najprostszym sposobem mam znaleziono:

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

Jedyny mankament: jest częścią EcmaScript 6 i nie działa na wszystkich przeglądarkach. –

+0

Kolejna wada: obejmuje tylko łączenie znaków, a nie pełną transliterację. – cmbuckley

+0

działa naprawdę fajnie w węźle node.js;) – superhero

Powiązane problemy