2016-10-09 3 views
0

У меня есть проблема с сравнением строк с разными кодами гольцов, но подобные символы, такие как следующий:Как сравнить строки, в которых отображаются похожие символы, но разные кодовые обозначения?

console.log('³' === '3') // false; 

ложного значение из кода выше из-за различные коды гольцов:

console.log('³'.charCodeAt(0)) // 179 
console.log('3'.charCodeAt(0)) // 51 

Что является универсальной решение для преобразования значений равно? Мне это нужно, потому что мне нужно сравнить все номера, как 1,2,3,4,5....

Благодарности

+0

Можете ли вы дать нам вполне определенное определение «подобных символов»? Вас беспокоит только десятизначный персонаж? – qxz

+1

JavaScript не видит, что они похожи, он просто видит коды, которые отличаются друг от друга ... – Li357

+0

@qxz да Я беспокоюсь только цифры цифры – Erik

ответ

3

Посмотрите в ASCII сворачивания, который в основном используется для преобразования символов с ударениями в безударных из них. Для него есть библиотека JS here.

Для вашего предоставленного примера это будет работать - для других примеров это может и не быть. Это зависит от того, как определена эквивалентность (никто, кроме вас, не знает, что вы подразумеваете под «похожими» - разные символы - разные персонажи).

Если вы знаете все символы, которые вы хотите отобразить уже, проще всего будет просто определить отображение себя:

var eqls = function(first, second) { 
    var mappings = { '³': '3', '3': '3' }; 

    if (mappings[first]) { 
     return mappings[first] == mappings[second]; 
    } 

    return false; 
} 

if (eqls('³', '3')) { ... } 
+0

Спасибо за ответ! – Erik

+0

' if (eqls ('³', '3')! == false) {...} ' – Paolo

0

Там нет «универсального решения»

Если вы «Только для того, чтобы иметь дело с цифрами, вы можете создать свою« таблицу эквивалентности », где для каждого поддерживаемого символа вы определяете« канонический »характер.

Например

var eqTable = []; // the table is just an array 

eqTable[179] = 51; // ³ --> 3 
/* ... */ 

Затем построить простой алгоритм, чтобы превратить строку в его канонической форме

var original,   // the source string - let's assume original=="³3" 
var canonical = ""; // the canonical resulting string 

var i, 
    n, 
    c; 

n = original.length; 
for(i = 0; i < n; i++) 
{ 
    c = eqTable[ original.charCodeAt(i) ]; 
    if(typeof(c) != 'undefined') 
    { 
     canonical += String.fromCharCode(c); 
    } 
    else 
    { 
     canonical += original[ i ]; // you *may* leave the original character if no match is found 
    } 
} 

// RESULT: canonical == "33" 
+0

Почему бы не использовать ассоциативный массив? Упрощен, чем иметь дело со всем существующим материалом в обычном. –

+0

Вам не нужно иметь дело с «материалом существования» с ассоциативным массивом при синтаксическом анализе строки? Я имею в виду: даже если вы используйте ассоциативный массив, который вы должны проверить, есть ли совпадение, и решить, что делать, если совпадение не найдено. – Paolo

+0

К сожалению, да, но это немного проще, более гибко и менее неясно (например, вы можете работать с строковые литералы вместо кодов ASCII, поскольку вы вынуждены использовать индексы массива). –