henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2021-09-06 01:31 pm

Амазонське char folding, або як у Сіетлі зневажають поляків

IMDB має автодоповнення пошуку ув <input>. Наприклад, для рядка 'ameli':

$ alias labels='json d | json -a l'
$ curl -s 'https://v2.sg.media-imdb.com/suggestion/a/ameli.json' | labels
Amélie
Amelia Warner (I)
Austin Amelio
Amelia Rose Blaire
Amelia Clarkson
Amelia Bullmore
Amelia Heinle
Amelia Eve

Документації на це, звичайно, немає. Character folding, у цьому прикладі (é → e), ми зробили самотужки. Уйоб сайт imdb це робить для користувача самостійно.

Людина ув амазоні, яка писала char folding, ніколи у житті не бачила мов центральної Європи та Балтики. Наприклад, назва польського кена Boże Ciało (я не дивився) містить у собі 2 дуже страшних літери, від яких сайту imdb стає зле.

Якщо ми зробимо запит без char folding, їхній бекенд нас розуміє:

$ curl -s 'https://v2.sg.media-imdb.com/suggestion/b/Boże%20Ciało.json' | labels
Corpus Christi
Corpus Christi
Olecia Obarianyk
Alecia Orsini Lebeda
The Cult: Edie (Ciao Baby)
Zwartboek: The Special
Anne-Marie: Ciao Adios
The C.I.A.: Oblivion

(Corpus Christi--переклад назви.)

але якщо надрукувати 'boże ciało' ув бовзері на уйоб сайті, той видає галімат'ю. JS там є ретельно--як це є прийнято ув великих корпораціях та посеред жлобів, котрі корпорації завжди дбайливо косплеять--обфускейшений, але хфункцію, яка робить char folding знайти можна.

Нижче imdb_chfold()--оригінальна амазонівська версія, а chfold--варіянт на сучасному JS, який робить теж саме, але без помилок:

$ cat imdb.js
// mein gott, lieber vasisualy
function imdb_chfold(a) {
  var G = /[àÀáÁâÂãÃäÄåÅæÆçÇèÈéÉêÊëËìÍíÍîÎïÏðÐñÑòÒóÓôÔõÕöÖøØùÙúÚûÛüÜýÝÿþÞß]/
  if (a) {
    var b = a.toLowerCase();
    return b.length > 20 && (b = b.substr(0, 20)),
    b = b.replace(/^\s*/, "").replace(/[ ]+/g, "_"),
    G.test(b) && (b = b.replace(/[àÀáÁâÂãÃäÄåÅæÆ]/g, "a")
            .replace(/[çÇ]/g, "c").replace(/[èÈéÉêÊëË]/g, "e")
            .replace(/[ìÍíÍîÎïÏ]/g, "i").replace(/[ðÐ]/g, "d")
            .replace(/[ñÑ]/g, "n").replace(/[òÒóÓôÔõÕöÖøØ]/g, "o")
            .replace(/[ùÙúÚûÛüÜ]/g, "u").replace(/[ýÝÿ]/g, "y")
            .replace(/[þÞ]/g, "t").replace(/[ß]/g, "ss")),
    b = b.replace(/[\W]/g, "")
  }
  return ""
}

function chfold(s) {
  return (s || '').substr(0, 20).normalize('NFD')
    .replace(/\p{Diacritic}/gu, '')
    .replace(/\u0142/g, "l") // a special case with the letter ł
    .trim().replace(/\s+/g, "_").replace(/[\W]/g, '').toLowerCase()
}

console.log(imdb_chfold(process.argv[2]))
console.log(chfold(process.argv[2]))

Щоб зрозуміти, чому 'Boże Ciało' не працює:

$ node imdb.js 'Boże Ciało'
boe_ciao
boze_cialo

або трошки інших літер:

$ node imdb.js 'ąśćńżółźćę'
o
ascnzolzce

кєк

Net income increased to $8.1 billion in the first quarter, or $15.79 per diluted share, compared with net income of $2.5 billion, or $5.01 per diluted share, in first quarter 2020.

[personal profile] sassa_nf 2021-09-06 11:30 am (UTC)(link)
А "ı" хаває?
westerby: (Default)

[personal profile] westerby 2021-09-07 04:28 am (UTC)(link)
ąśćńżółźćę

Дякую, я тепер буду знущатися над деякими людьми: буду пропонувати їм вимовити це "слово" (я особисто щойно зміг гг)
kondybas: (Default)

[personal profile] kondybas 2021-09-09 03:10 pm (UTC)(link)
\o
westerby: (Default)

[personal profile] westerby 2021-09-09 11:07 pm (UTC)(link)
ггг
What's a ðùðëtté anyway? (неосилив)