utf8 texto special convertir codigo characters acentos javascript compare polish

texto - Cómo comparar cadenas Unicode en Javascript?



javascript utf8 encode (5)

Aquí hay un ejemplo del alfabeto francés que podría ayudarlo con una clasificación personalizada:

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; }; };

Para usarlo en una matriz de cadenas a :

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

Agregue 1 o -1 como el segundo parámetro de alpha() para ordenar ascendente o descendente.
Agregue true como el 3er parámetro para ordenar mayúsculas y minúsculas.

Es posible que necesite agregar números y caracteres especiales a la lista del alfabeto

Cuando escribí en JavaScript "Ł" > "Z" , devuelve true . En orden Unicode, debe ser, por supuesto, false . ¿Cómo arreglar esto? Mi sitio usa UTF-8.


Código de Mic mejorado para caracteres no mencionados:

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]");


Es curioso, tengo que pensar en ese problema y terminé de buscar aquí, porque se me ocurrió que puedo usar mi propio módulo de JavaScript. Escribí un módulo para generar una URL limpia, por lo tanto, tengo que translitar la cadena de entrada ... ( 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"

Ahora puedes ordenar con estos resultados. Puedes ex. almacene el título original en el campo "título" y el campo para clasificar en "title_sort" con el resultado de mySlug.


Es posible que pueda crear su propia función de clasificación utilizando localeCompare() que, al menos de acuerdo con el artículo de MDC sobre el tema , debe ordenar las cosas correctamente.

Si eso no funciona, aquí hay una pregunta SO muy interesante en la que el OP emplea un reemplazo de cadena para construir un mecanismo de clasificación de "fuerza bruta".

También en esa pregunta, el OP muestra cómo crear una función textExtract personalizada para el plugin jQuery tablesorter que hace una ordenación que tenga en cuenta el entorno local, tal vez también valga la pena echarle un vistazo.

Editar: Como una idea totalmente remota, no tengo idea de si esto es factible en absoluto, especialmente por cuestiones de rendimiento, si está trabajando con PHP / MySQL en el back-end de todos modos, me gustaría mencionar la posibilidad de enviando una consulta Ajax a una instancia mySQL para que se ordene allí. mySQL es excelente para ordenar los datos conscientes de la configuración regional, ya que puede forzar las operaciones de clasificación en una intercalación específica utilizando, por ejemplo ORDER BY xyz COLLATE utf8_polish_ci , COLLATE utf8_german_ci ... esas intercalaciones se encargarían de todos los problemas de clasificación a la vez.