[ID CS4-CS6] getFiles и буква "й" на Mac

Tiburtsy

Топикстартер
15 лет на форуме
Сообщения
60
Реакции
14
Продолжаем исследовать функцию getFiles. На Mac она даёт имя файла с буквой "й" как два символа и обычный поиск "й" не даёт результатов. На Win10 поиск в скрипте работает без проблем. Подозреваю, что "ё" и "ь", а также другие символы, например, из немецкого алфавита с умляутами и прочей хренью, дадут тот же результат. Простого решения не нашёл. Есть мысли по теме, может кто сталкивался? Совет- не использовать русский алфавит не приемлем - база файлов медийных персон, русские и латиницей имена, источник фото (всё в названии файла), три дизайнера - не проконтролируешь, около 1000 файлов в сетевом хранилище.
 
это какое имя?
Screenshot 2019-01-18 04.15.02.png
 
вот так в общем можно, подумаешь, два символа )

Код:
var a = Folder.selectDialog();
var b = a.getFiles(isFile);
$.writeln(b.toSource());

function isFile(obj)
{

    if (File(obj).displayName.indexOf("\u0438\u0306")!=-1) return true;
    
    return false;
}
 
Здесь коллизию с буквой "й" на маке уже описывали уже немножко в другом аспекте - помнится, файл не импортивался из-за наличия диакритики в названии. На самом деле, проблема чисто организационная - один набирает так, другой иначе, никуда от этого не денешься. То же самое, как с буквой ё - одни набирают правильно, другие бывают на е, третьи вообще латинскую пишут. Придется проверять все варианты, благо их не так много.
 
Здесь коллизию с буквой "й" на маке уже описывали уже немножко в другом аспекте - помнится, файл не импортивался из-за наличия диакритики в названии. На самом деле, проблема чисто организационная - один набирает так, другой иначе, никуда от этого не денешься. То же самое, как с буквой ё - одни набирают правильно, другие бывают на е, третьи вообще латинскую пишут. Придется проверять все варианты, благо их не так много.
Имя файла задаётся во время записи из фотошопа. Там букву "й" сложно набрать по другому, как и "ё".
 
if(File(a).displayName=="й"){$.writeln(i)}//никогда под Mac
}
Вообще то в редакторе сообщений есть специальный тег кода </>, в который надо такие выражения заворачивать
Дабы не было подобных коллизий
 
@Tiburtsy,
JavaScript:
#target "estoolkit"   /* whatever */

if ( 'function' !== typeof String.prototype.normalize ) {
/*   
    load once
*/
    $.evalFile ( 'es5-shim.js' );   // for reduceRight only, actually
    $.evalFile ( 'unorm.js' );
}

$.writeln( "\u0438\u0306".normalize( 'NFC' ).length );  // 1
$.writeln( "й" === "\u0438\u0306".normalize());         // true
$.writeln( "àáâãäå".normalize( 'NFD' ).length );        // 12

UAX #15: Unicode Normalization Forms
String.prototype.normalize()
https://github.com/walling/unorm
https://github.com/es-shims/es5-shim


P.S. Никто, конечно, не набирает "й" как "\u0438\u0306". MacOS нормализует к NFD.
 
Последнее редактирование:
  • Спасибо
Реакции: Tiburtsy и Skvoznyak
Ваш способ не прошёл - выдал где-то ошибку. На досуге потестирую ещё.
Сделал так:
JavaScript:
var diacritic={
    "\u0438\u0306": "й",
    "\u0418\u0306": "Й",
    "\u0435\u0308": "ё",
    "\u0415\u0308": "Ё"
};
var sTemp=[];for(var key in diacritic) sTemp.push(key);
var regDiacritic=new RegExp(sTemp.join("|"),"g");
//...
s=t.displayName.replace(regDiacritic,function(key){return diacritic[key]});
Может код не оптимален, не знаю как избавиться от временного массива, но можно добавлять другие проблемные символы (фактически замена по списку в RegExp). И работает!
 
Последнее редактирование:
Попробуйте вместо включения первой библиотеки добавить polyfill. Даже не спрашиваю, что бы значило "выдал где-то ошибку", т.к. у меня и мака-то нет, и + если работает -- достаточно. Но если что, люди вообще все "проблемные символы" предусмотрели, в этом и смысл использования библиотеки.
 
  • Спасибо
Реакции: Skvoznyak