Когда я писал в JavaScript "Ł" > "Z"
, он возвращает true
. В порядке Unicode это должно быть, конечно, false
. Как это исправить? Мой сайт использует UTF-8.
Как сравнить строки Unicode в Javascript?
Ответ 1
Вы можете использовать Intl.Collator
или String.prototype.localeCompare
, введенный API интернационализации ECMAScript:
"Ł".localeCompare("Z", "pl"); // -1
new Intl.Collator("pl").compare("Ł","Z"); // -1
-1
означает, что Ł
предшествует Z
, как вы хотите.
Обратите внимание, что это работает только в последних браузерах.
Ответ 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.