Подтвердить что ты не робот

Как сравнить строки Unicode в Javascript?

Когда я писал в JavaScript "Ł" > "Z", он возвращает true. В порядке Unicode это должно быть, конечно, false. Как это исправить? Мой сайт использует UTF-8.

4b9b3361

Ответ 2

Вот пример французского алфавита, который мог бы помочь вам в создании специального вида:

var alpha = function(alphabet, dir, caseSensitive){
  return function(a, b){
    var pos = 0,
      min = Math.min(a.length, b.length);
    dir = dir || 1;
    caseSensitive = caseSensitive || false;
    if(!caseSensitive){
      a = a.toLowerCase();
      b = b.toLowerCase();
    }
    while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; }
    return alphabet.indexOf(a.charAt(pos)) > alphabet.indexOf(b.charAt(pos)) ?
      dir:-dir;
  };
};

Чтобы использовать его в массиве строк a:

a.sort(
  alpha('ABCDEFGHIJKLMNOPQRSTUVWXYZaàâäbcçdeéèêëfghiïîjklmnñoôöpqrstuûüvwxyÿz')
);

Добавьте 1 или -1 в качестве второго параметра alpha() для сортировки по возрастанию или убыванию.
Добавьте true в качестве третьего параметра для сортировки регистра.

Вам может потребоваться добавить числа и специальные символы в список алфавита

Ответ 3

Возможно, вы сможете создать свою собственную функцию сортировки с помощью localeCompare(), которая, по крайней мере, согласно статье MDC по теме - должен правильно сортировать вещи.

Если это не сработает, вот интересный вопрос SO, где OP использует замену строк для создания механизма сортировки "грубой силы".

Также в этом вопросе OP показывает, как построить пользовательскую функцию textExtract для плагина jQuery tablesorter, который выполняет сортировку по локали, - может быть, также стоит смотреть.

Изменить: Как совершенно далекая идея - я понятия не имею, возможно ли это вообще, особенно из-за проблем с производительностью - если вы работаете с PHP/mySQL на внутренней стороне В любом случае, я хотел бы упомянуть о возможности отправки Ajax-запроса в экземпляр mySQL, чтобы он отсортировался там. mySQL отлично справляется с сортировкой данных, зависящих от локали, поскольку вы можете принудительно выполнять операции сортировки в конкретном сопоставлении с использованием, например, ORDER BY xyz COLLATE utf8_polish_ci, COLLATE utf8_german_ci.... эти сопоставления сразу позаботятся о всех проблемах, связанных с сортировкой.

Ответ 4

Улучшен код микрофона для не упомянутых символов:

var alpha = function(alphabet, dir, caseSensitive){
  dir = dir || 1;
  function compareLetters(a, b) {
    var ia = alphabet.indexOf(a);
    var ib = alphabet.indexOf(b);
    if(ia === -1 || ib === -1) {
      if(ib !== -1)
        return a > 'a';
      if(ia !== -1)
        return 'a' > b;
      return a > b;
    }
    return ia > ib;
  }
  return function(a, b){
    var pos = 0;
    var min = Math.min(a.length, b.length);
    caseSensitive = caseSensitive || false;
    if(!caseSensitive){
      a = a.toLowerCase();
      b = b.toLowerCase();
    }
    while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; }
    return compareLetters(a.charAt(pos), b.charAt(pos)) ? dir:-dir;
  };
};

function assert(bCondition, sErrorMessage) {
      if (!bCondition) {
          throw new Error(sErrorMessage);
      }
}

assert(alpha("bac")("a", "b") === 1, "b is first than a");
assert(alpha("abc")("ac", "a") === 1, "shorter string is first than longer string");
assert(alpha("abc")("1abc", "0abc") === 1, "non-mentioned chars are compared as normal");
assert(alpha("abc")("0abc", "1abc") === -1, "non-mentioned chars are compared as normal [2]");
assert(alpha("abc")("0abc", "bbc") === -1, "non-mentioned chars are compared with mentioned chars in special way");
assert(alpha("abc")("zabc", "abc") === 1, "non-mentioned chars are compared with mentioned chars in special way [2]");

Ответ 5

Вы должны сохранить две строки сортировки ключей. Один для первичного порядка, где немецкий ä = a (первичный a-> a) и французский é = e (первичный ключ сортировки e-> e) и один для вторичного порядка, где ä следует после (перевод a-> azzzz во вторичном ключе) или é следует после e (вторичный ключ e-> ezzzz). Особенно в чешском языке некоторые буквы являются вариациями буквы (áéí…), в то время как другие стоят в своем полном праве в списке (ABCČD… GHChI… RŘSŠT…). Плюс проблема в том, чтобы рассматривать орграфы единичными буквами (первичные ch-> hzzzz). Нет тривиальной проблемы, и в JS должно быть решение.

Ответ 6

Забавно, я должен подумать об этой проблеме и закончить поиск здесь, потому что это пришло в голову, что я могу использовать свой собственный модуль javascript. Я написал модуль для создания чистого URL-адреса, поэтому мне нужно перевести входную строку... (http://pid.github.io/speakingurl/)

var mySlug = require('speakingurl').createSlug({
    maintainCase: true,
    separator: " "
});

var input = "Schöner Titel läßt grüßen!? Bel été !";
var result;

slug = mySlug(input);
console.log(result); // Output: "Schoener Titel laesst gruessen bel ete"

Теперь вы можете сортировать результаты. Вы можете, например. сохраните исходный тилит в поле "title" и поле для сортировки в "title_sort" с результатом mySlug.