РЕДАКТИРОВАТЬ: я буду добавлять больше, как я думаю о них.
Вам не нужен существующий код, который вы должны поддерживать. Наследие кода, который требует, чтобы все было в 8- или 16-битных единицах кода, - это королевская боль. Это делает даже библиотеки неловкими, когда вам приходится поддерживать уже существующие модели, которые не учитывают это.
Вы должны работать только со слепыми, чтобы не возникало проблем со шрифтами. :)
Вы должны следовать правилам Юникода для символов идентификаторов и символов синтаксиса шаблона. Вы должны нормализовать свои идентификаторы внутри страны. Если ваш язык сам по себе является LTR, вы можете не захотеть использовать идентификаторы RTL; непонятно здесь.
Вам необходимо предоставить примитивы на вашем языке, которые соответствуют концепциям Юникода, например, вместо прописных и строчных букв вам нужны прописные, прописные, строчные и заглавные буквы (или lc, uc, tc и fc).
Вам необходимо предоставить полный доступ к базе данных символов Unicode, включая все свойства символов, чтобы с их помощью можно было легко создавать алгоритмы различных технических отчетов.
Вам нужна четкая логическая модель, которую можно легко расширять для графем по мере необходимости. Точно так же, как люди поняли, что интерфейс кодовой точки намного важнее, чем интерфейс кодовой единицы, вы должны иметь возможность иметь дело с графемами и т. Д. Например, никто в здравом уме не должен быть вынужден переписывать:
printf "%-10.10s", $string;
как это каждый раз:
# this library treats strings as sequences of
# extended grapheme clusters for indexing purposes etc.
use Unicode::GCString;
my $gcstring = Unicode::GCString->new($string);
my $colwidth = $gcstring->columns();
if ($colwidth > 10) {
print $gcstring->substr(0,10);
} else {
print " " x (10 - $colwidth);
print $gcstring;
}
Кстати, вы должны сделать это так, потому что вам нужно иметь представление о столбцах печати, которые могут быть 0 для комбинированных и управляющих символов или 2 для символов с определенными свойствами ширины в Восточной Азии. И т. Д. Было бы намного лучше, если бы не было printf
кода, чтобы вы могли начать с нуля и сделать все правильно. Я понятия не имею, что делать с шириной скриптов RTL.
Операционная система - это уже существующая библиотека кодовых единиц.
Вам не нужно взаимодействовать с пространством имен файловой системы, поскольку вы не можете контролировать, запускает ли файловая система A через NFD (я считаю, что Linux), файловая система B запускает через NFC (HSF +, почти) или файловую систему C ( традиционный Unix) вообще ничего нет. С другой стороны, возможно, что вы сможете предоставить здесь слой абстракции с локальными фильтрами, чтобы скрыть часть этого от пользователя, если это возможно. Операционные системы всегда имеют ограничения в единицах кода, а не в единицах кода, что вас раздражает.
Другие вещи с соглашениями о единицах кода включают базы данных, которые распределяют записи фиксированного размера. Фиксированный размер просто не работает: он враждебен графемам, а форма нормализации враждебна.