TL; DR Я думаю, что ваш вопрос обоснован и заслуживает лучшего ответа, чем тот, который я написал до сих пор.Давайте поговорим.
Я не думаю, что кто-то может создать шифр Цезаря с перечисленными вами требованиями по нескольким причинам.
Но если ваша цель на самом деле "исследовать свойства Unicode"вместо того, чтобы создавать шифр, тогда, по-видимому, это не имеет значения.
И, конечно, я мог просто испытывать недостаток воображения или просто неспособность понять Unicode, несмотря на то, что потратил годы на борьбу с ним.
Если вы критикуете технические аспекты моего объяснения ниже с помощью комментариев, я постараюсь улучшить его, и, надеюсь, мы оба научимся по ходу дела.TIA.
"Шифр Цезаря со всеми печатными символами Юникода"
Это чистая формулировка, которая у вас есть в заголовке.
Единственные проблемные части - "Цезарь", "шифр "," все "," Unicode "," для печати "и" символы ".Давайте пройдемся по ним.
Шифр Цезаря
Шифр Цезаря - это особенно простой шифр с одним алфавитом.Unicode - это не один большой алфавит.Но, возможно, вы могли бы обработать подмножество его кодовых точек, как если бы они были.
Я бы сказал, что это то, о чем был SO Шифр со всеми символами Unicode .
В настоящее время вы отклонили это и представили множество дополнительных аспектов, которые либо невозможны, либо настолько сложны, что они могут быть такими же.
Игнорирование вашего приоритета в исследовании свойств Unicode будет иметь смысл, если вы вместо этого согласитесь наобычный шифр ASCII.Или, возможно, вернитесь к этому Шифру со всеми символами Unicode SO и выберите, где они остановились, возможно, отметив, что согласно комментарию к этому SO они, очевидно, остановились только на BMPплоскость:
Обратите внимание, что вы используете только кодовые точки BMP (т.е. от U + 0000 до U + FFFF).Юникод варьируется от U + 0000 до U + 10FFFF, поэтому вам не хватает около миллиона кодовых точек:)
Так что, возможно, вы могли бы добиться большего.Я не думаю, что это было бы целесообразно с точки зрения создания шифра для самого себя, но это может быть для того, чтобы узнать больше о свойствах Unicode.
Cipher
@ TomBlodget в их комментарий к вашему вопросу отмечает, что:
Сложность текста побуждает современные шифры не иметь дело с символами.Они имеют дело с байтами для ввода и вывода.Там, где ввод текста, получателю нужно сообщить кодировку.Если дальнейшая обработка вывода должна быть в виде текста, используется Base64 или аналогичный.Ожидать, что вывод шифра будет выглядеть как текст, обычно не является целью.
Если вы хотите универсальное решение для шифра Unicode, следуйте рецепту Тома.
Все
В комментарии к вашему вопросу о количестве графем @nwellnhof отметил, что:
существует бесконечное число
Но вы тогдатакже вполне разумно ответил, что в любом данном тексте будет только конечное число;намерение Unicode заключается в том, что совместимое с Unicode программное обеспечение может / будет генерировать результаты mojibake, если дан вырожденный ввод (где то, что считается вырожденным, несколько открыто для уточнения в обновлениях Unicode);и это основа, на которой вы надеетесь продолжить.
Это разумный ответ, но вы все равно не можете иметь «все», даже если ограничено «все невырожденные» и «только те, которые могут появиться»в реальной жизни ", потому что по-прежнему существует фактически бесконечное число правильно сформированных и потенциально разумных символов.
Я действительно должен вставить некоторые вычисления здесь, чтобы наложить некоторые ограничения на проблему.«Фактически бесконечен» триллион?Зачем?Что-то в этом роде.Но прежде чем углубляться в это, я буду ждать комментариев.
Давайте представим, что это триллион, и это не проблема, и продолжим.
Unicode
Юникод чрезвычайно сложен.
Вам было дано задание на создание шифра Цезаря, очень простая вещь.
Они действительно не очень хорошо смешиваются, если вы не склонны сильно хранитьвсе просто.
Но вы хотите исследовать свойства Unicode.Так что, возможно, вы хотите вникнуть во все сложности.Но тогда возникает вопрос: сколько лет вы хотите потратить на изучение последствий вскрытия ящика этой пандоры?(Я изучал Unicode и выключал его в течение десяти лет. Это сложно.)
Printable
Вы связались с SO-вопросом "Каков диапазон печатных символов Unicode?".Это включает в себя ответ, который отмечает:
Чем больше вы узнаете о Юникоде, тем больше понимаете, насколько неожиданно разнообразны и непостижимо странные человеческие системы письма.В частности, не всегда очевидна возможность печати определенного «символа».
Но вы, вероятно, читали это и отказывались сдерживаться.Который и восхитителен и вызывает проблемы.Например, кажется, что вы заставили вас определить «пригодный для печати» как что-то вроде «требует одного или нескольких нажатий клавиш для обхода», что настолько чревато, что трудно понять, с чего начать - поэтому я расскажу об этом позжеответ.
Символы
Учитывая, что ваша цель состоит в том, чтобы написать шифр Цезаря, шифр, который использовался тысячи лет назад и который воздействует на персонажей, имеет смысл, что вы сосредоточились напользователь считает символом ".
Per определение Unicode , это называется" графема ".
Один из ваших примеров символов дает понять, насколько проблематично различиенаходится между «тем, что пользователь считает символом» (графемой) и кодовой точкой (то, что Python считает символом):
print('क्षि'[::-1])
िष्क
Это показывает искажение одного «символа» (одногографема) написано в Деванагари, который, согласно Википедии, «одна из самых используемых и принятых систем письма в мире».
(Или, если мы хотим игнорировать половинуПланета, на которую эта калечащая сила воздействует все чаще и чаще, фокусируется только на людях, которые думали, что они в безопасности:
print('??'[::-1])
??
Это флаг одной нации, превращающейся в другую.К счастью, флаги редко появляются в тексте - хотя сейчас это меняется, текст становится все более произвольным Unicode-текстом, как этот текст, который я пишу, - и символы флагов не так важны, и Великобритания и Болгария являются членами ЕС, так что, вероятно, это не совсемтак же плохо, как шифрование текста миллиарда индейцев.)
Графемы
Итак, вы вполне разумно подумали: «Может быть, Perl 6 поможет».
Цитировать UAX # 29 , документ Приложения Unicode по "Сегментации текста Unicode":
Этот документ определяет спецификацию по умолчанию для кластеров графем.
Perl 6реализовал механизм кластеризации графемы.В принципе, он может кластеризоваться различными способами, но на данный момент реализована спецификация по умолчанию.Это то, что позволяет Perl 6 избежать ошибок, допущенных Python в приведенном выше.
Но документ Unicode продолжается:
[спецификация для кластеров графем] может быть настроена для конкретных языков, операции или другие ситуации.
Таким образом, вы не можете просто просмотреть текст (или передать его некоторому программному обеспечению) и сказать, какие «символы» он содержит, если под «символом» вы подразумеваете «что»пользователь воспринимает это как символ ".
Становится хуже ...
Нажатия клавиш
" ????ij क्षि ? "... блокнот ... 10 нажатий клавиш ... поиск в Google ... 7 нажатий ... Perl6 ... Редактор Atom ... Perl6 думает क्षि ... на самом деле это 2 графемы ... Я думаю, что это ошибка... блокнот (и поиск в Google) считает, что это одна графема / символ
Для поиска Google требуется 10 тыс.Удары глаз - потому что это связано не с поиском в Google, а с аспектами моей системы, в том числе с тем, какой веб-браузер я использую (Firefox), и другими деталями.
Некоторые редакторы могут быть настроены так, чтобы курсоры над ними क्षि'(или' fi ') будет 1 или 2 нажатиями клавиш, в зависимости от того, как вы их конфигурируете и / или на каком языке вы указываете текст, на котором написан. Для меня, редактирование этого SO ответа с помощью Firefox на Linux Mint, требует 2 нажатий клавишчтобы навести курсор на क्षि.
Perl 6 правильно сообщает результат .chars
для 'क्षि' как 2 по умолчанию, потому что это то, что Unicode говорит, что это согласно спецификации кластеризации графем по умолчанию.(«Расширенные кластеры графем».) Это соответствует тому, что Firefox в Linux Mint редактирует этот SO-ответ, потому что звезды выстраиваются в ряд и наступает воскресенье.
Блокнот или другое программное обеспечение разумно требует всего одного нажатия клавиши, чтобы навести курсор на क्षिв то время как другие редакторы разумно берут два, потому что оба приемлемы в соответствии со спецификацией Unicode:
движение клавиш со стрелками ... может использовать знания, специфичные для определенных шрифтов, чтобы перейти к болееболее детально, в тех случаях, когда было бы полезно редактировать отдельные компоненты
Мой выделен .Unicode оставляет за собой право программного обеспечения решать, как будет двигаться курсор.
Ваши вопросы
1: является ли приведенное выше точное определение того, что означает быть печатаемым символом вUnicode?
Я так не думаю.Надеемся, что вышеизложенное объясняет, почему, или, по крайней мере, указывает вам направления, которые вам необходимо изучить (в течение года или трех), чтобы понять, почему.
2: ... знаете ли вы какой-либо списокпечатных символов, которые покрывают используемые в настоящее время плоскости юникода и возможные кластеры графем ...
Существует такое огромное количество "возможных кластеров графем", которое может происходить разумным образом, что даже исключая вырожденные комбинации кодовых точек, вы оставляетефактически бесконечный список.
И любое небольшое подмножество, которое кто-либо может создать, не будет каноническим, потому что консорциум Unicode не благословит его, и народ будет спорить о том, что должно быть включено.
3: ... как бы вы могли создать такой список, с помощью которого я мог бы создать шифр Цезаря, который мог бы шифровать любой / все печатаемые символы при следующих 4 условиях?
Во-первых, ваши условияслишком напряженный.См. Следующий раздел.
Но даже если вы отбросите слишком сложные, это все равно будет слишком сложно, а результат слишком неинтересен, чтобы делать что-то стоящее.
4: Если вы думаете, что создание такого списка - ужасная идея, как бы вы создали шифр?
Если бы это был я, и это должен был быть шифр Цезаря, я бы сделал это простобайт, согласно комментарию Тома в начале этого ответа.
Ваши условия
Зашифрованная строка будет допустимой строкой utf8, состоящей из стандартных кодовых точек Unicode (без неназначенныхили кодовые точки области личного использования)
Это должно быть больше ограничено чем то, но разумно сказать, что это должна быть допустимая строка Unicode.Если вы хотите настаивать на том, что это utf8, это тоже хорошо.
Зашифрованная строка также должна быть допустимой строкой utf8, состоящей из стандартных кодовых точек Юникода
Конечно.
Вы должны иметь возможность проходить зашифрованную строку, используя то же количество ударов ..., что и исходная строка
Это может быть для небольшого подмножества символов Юникода.Но ...
Это означает [одно нажатие клавиши как для исходной, так и для кодированной версии] символа деванагари [क्षि]
... не является разумным требованием.
Вы могли бы обеспечить ту же графемукластеризация (символьная) интерпретация заданного текста, если вы написали пользовательскую реализацию кластеризации графем для своего шифра, которая была точной копией реализации кластеризации графем, используемой для управления курсором.
Но тогда вы бызатем необходимо поддерживать эти две базы кода, чтобы синхронизировать их.И это будет только для одной конкретной конфигурации системы.
Это будет нелепое количество боли.И для нуля или, самое большее, крошечного, усиления.
строка, которая должна быть зашифрована, и строка, которая была расшифрована (конечный результат), должна содержать точно такие же кодовые точки (2 строки должны быть равны).
Итак, нормализации нет.
Это исключает все полезные свойства Perl 6.
Опять же, вам все равно нужно отказаться, обращая внимание на графемы в любом случае.потому что их фактически бесконечно много.
Заключение
Мой ответ лишь слегка затрагивает темы, которые он охватывает, и, вероятно, содержит много ошибок.Если вы критикуете это, я постараюсь улучшить его.