Шифр Цезаря со всеми печатаемыми символами Unicode

Я хочу создать шифр Цезаря, который может кодировать / декодировать печатаемые символы Unicode (кластеры графем с одним и несколькими кодовыми точками, смайлики и т. Д.) Из всего Unicode (кроме области частного использования). Желательно использовать список всех печатаемых символов.

ПРИМЕЧАНИЕ. Несмотря на то, что я хочу создать шифр Цезаря, на самом деле речь идет не о шифровании. Речь идет об исследовании свойств юникода.

Я нашла такие вопросы:

Каков диапазон печатаемых символов Юникода?

Шифр ​​со всеми символами Юникода

Но я не получил ответа на то, что хочу.

Примечание: если вы дадите кодовый ответ, меня больше всего интересует решение, в котором используется python3 или perl6, поскольку они являются моими основными языками.

Недавно мне дали задание написать шифр Цезаря, а затем закодировать и декодировать английский текст.

Я решил это в python, используя встроенную константу string.printable библиотеки строк. Вот распечатка константы: (я использовал код Visual Studio)

[см. код Python и результаты ниже]

В документации сказано: '' 'Строка символов ASCII, которые считаются печатаемыми. Это комбинация цифр, букв ascii, знаков препинания и пробелов. '' 'https://docs.python.org/3.6/library/string.html#string-constants

Мне интересно, как вы могли бы создать шифр Цезаря, который мог бы кодировать / декодировать все возможные печатные символы, которые вы можете сделать из кодовых точек Unicode (точно так же, как у вас есть все необходимые шрифты, чтобы увидеть те, которые должны быть видны на экране).

Вот мое понимание того, что значит быть печатным персонажем:

Когда я беру строковую константу python, указанную выше, и перемещаюсь по ней с помощью клавиш со стрелками влево или вправо на клавиатуре, мне требуется ровно 100 штрихов, чтобы добраться до конца (столько же, сколько и количество символов). Похоже, существует взаимно однозначное соответствие между тем, чтобы быть печатным символом и его можно было прочесть одним движением клавиши со стрелкой.

Теперь рассмотрим эту строку:

"????‍????‍????‍????ij क्षि ????"

На основе константы pythons string.printable, эта строка, как мне кажется, состоит из следующих 7 печатных символов: (вы можете найти отдельные кодовые точки по адресу: https://unicode-table.com/en/)

1 (семейство) 2 (латинская малая лигатура Ij) 3 (возврат кариеса) 4 (деванагари кши) 5 (пробел) 6 (непрерывный пробел нулевой ширины) 7 (туз пик)

????‍????‍????‍???? кодовые точки: 128104 8205 128105 8205 128103 8205 128102 (ссылка: https://emojipedia.org/family-man-woman-girl-boy/)

(Строчная латинская лигатура Ij) ij код: 307

Код (возврат каретки): 13

(Деванагари кши) क्षि кодовые точки: 2325 2381 2359 2367
(см. Эту страницу: http://unicode.org/reports/tr29/) (кодовые точки кажутся шестнадцатеричными, а не числовыми)

(Пробел) код: 32

(Пробел нулевой ширины): 65279 (AKA U + FEFF BYTE ORDER MARK (BOM)) (https://en.wikipedia.org/wiki/Byte_order_mark)

(Игральная карта Туз пик) ???? codepoint: 127137

Когда я вставляю эту строку в блокнот и пытаюсь пройти по ней с помощью клавиши со стрелкой, я получаю 10 нажатий клавиш, а не 7, потому что семейным эмодзи нужно 4 нажатия клавиш (вероятно, потому, что блокнот не может справиться с соединителем нулевой ширины, codepoint : 8205, и, конечно же, блокнот не может отображать семейный глиф). С другой стороны, когда я отправляю строку в поиск Google, я могу пройти по всей строке за 7 штрихов.

Затем я попытался создать строку в Perl6, чтобы увидеть, что понимание графемы Perl6 сделает строку:

(Я использую редактор Atom)

[см. код Perl6 и результаты ниже]

perl6 считает, что символ деванагари кши क्षि (4 кодовых точки) на самом деле представляет собой 2 графемы, каждая из которых имеет 2 кодовых точки. Несмотря на то, что он МОЖЕТ быть представлен как два символа, как видно из приведенного выше списка, я думаю, что это ошибка. Предполагается, что Perl6 поддерживает графемы, и даже мой блокнот Windows (и поиск в Google) думает, что это одна графема / символ.

Основываясь на двух строках, практическое определение печатаемого символа выглядит следующим образом: «Это любая комбинация кодовых точек Юникода, которую можно пройти одним нажатием клавиши со стрелкой влево или вправо на клавиатуре при идеальных обстоятельствах».

«при идеальных обстоятельствах» означает, что вы используете среду, которая, так сказать, действует как поиск в Google: то есть распознает, например, эмодзи (семья из 4 человек) или кластер графем (персонаж деванагари) как одну печатную персонаж.

3 вопроса:

1: Правильно ли приведенное выше определение того, что значит быть печатным символом в Юникоде?

2: Независимо от того, принимаете ли вы определение, знаете ли вы какой-либо список печатаемых символов, который охватывает используемые в настоящее время плоскости Unicode и возможные кластеры графем, а не только 100 символов ASCII, которые есть в строковой библиотеке Python (если бы у меня был такой список Думаю, я мог бы довольно легко создать шифр)?

3: Учитывая, что такой список не существует, и вы принимаете определение, как бы вы создали такой список, с помощью которого я мог бы создать шифр Цезаря, который мог бы шифровать любые / все печатные символы при следующих 4 условиях?

ПРИМЕЧАНИЕ: эти 4 условия - именно то, что, как мне кажется, требуется для правильного шифра Цезаря.

условие а

Зашифрованная строка будет действительной строкой utf8, состоящей из стандартных кодовых точек Unicode (без неназначенных или частных кодовых точек).

условие b

Зашифрованная строка также должна быть допустимой строкой utf8, состоящей из стандартных кодовых точек Unicode.

условие c

Вы должны иметь возможность перемещаться по зашифрованной строке, используя такое же количество штрихов клавишами со стрелками влево или вправо на клавиатуре, что и исходная строка (при идеальных обстоятельствах, как описано выше). Это означает, что и семейный эмодзи мужчина-женщина-мальчик-девочка, и символ деванагари при кодировании должны соответствовать ровно одному другому печатаемому символу, а не набору кодовых точек "несущества", которые клавиши со стрелками будут интерпретировать как разные символы. Это также означает, что один символ кодовой точки потенциально может быть преобразован в многоточечный символ и наоборот.

условие d

Как и в любом алгоритме шифрования / дешифрования, строка, которая должна быть зашифрована, и строка, которая была расшифрована (конечный результат), должны содержать одни и те же кодовые точки (две строки должны быть равны).

# Python 3.6:
import string           
    # build-in library
print(string.printable)      
print(type(string.printable))   
print(len(string.printable))    
    # length of the string (number of ASCII characters)


#perl6
use v6;

my @ordinals = <128104 8205 128105 8205 128103 8205 128102>;    
    #array of the family codepoints
@ordinals.append(<307 13 2325 2381 2359 2367 32 65279 127137>); 
    #add the other codepoints
my $result_string = '';
for @ordinals {
    $result_string = $result_string ~ $_.chr;  
}
    # get a string of characters from the ordinal numbers
say @ordinals;              # the list of codepoints
say $result_string;             # the string
say $result_string.chars;       # the number of characters.
say $result_string.comb.perl;   # a list of characters in the string

результаты python:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ! "# $% & '() * +, -. / :;‹ =>? @ [] ^ _ `{|} ~

класс 'str'

100

perl6 результаты:

[128104 8205 128105 8205 128103 8205 128102 307 13 2325 2381 2359 2367 32 65279 127137]

????‍????‍????‍????ij क्षि ????

8

(«????‍????‍????‍????», «ij», «\ r», «क्», «षि», «», «», «????»). Seq


person Arimaafan    schedule 19.01.2019    source источник
comment
хммм, я только что разместил этот вопрос 10 минут назад, и у меня уже есть -2. Что не так с моим вопросом?   -  person Arimaafan    schedule 19.01.2019
comment
Обратите внимание, что существует бесконечное количество кластеров графем Unicode, потому что кластеры могут содержать произвольное количество комбинированных меток. Таким образом, ваш шифр, вероятно, должен быть основан на отдельных кодовых точках.   -  person nwellnhof    schedule 19.01.2019
comment
Существует огромное количество возможных комбинаций кодовых точек Юникода, но лишь сравнительно небольшое их количество будет кластерами графем. Например, если вы поместите «A» (код 65) и «B» (код 66) рядом друг с другом, они не будут формировать кластер графемы. Поэтому я думаю, что вполне разумно искать полный список печатаемых символов для данной версии юникода (я думаю, что это самая последняя версия 11.0).   -  person Arimaafan    schedule 19.01.2019
comment
@mwellnhof Я понимаю, что вы говорите, но я думаю, что есть и другие вещи, которые следует учитывать. Я отредактирую свой вопрос и объясню, что я думаю. (мой старый комментарий, когда он устарел, и я не могу его отредактировать)   -  person Arimaafan    schedule 19.01.2019
comment
Это сложно. Некоторые языки идут вправо, некоторые - влево, при кодировании направление может измениться, что затрудняет восстановление конечной строки [при печати, в виде массива, не проблема]. Я не согласен с @nwellnhof: существует максимальное количество комбинируемых символов (для четко определенной строки), но в любом случае для многих букв вы можете добавлять акцент и другие модификаторы в другом порядке. (и unicode IIRC ограничивается до 16, поэтому число таких модификаторов равно степени 16). Не все символы можно различить (в приложении). И Caesar-cipher очень недельный: так что не переусердствуйте.   -  person Giacomo Catenazzi    schedule 19.01.2019
comment
Моя рекомендация: кодируйте строку Unicode, а затем кодируйте кодировку с помощью BASE64. Затем у вас есть 64 символа и используйте на них цезарь. В любом случае: ЭТО СЛАБОЕ ШИФРОВАНИЕ. НЕ ИСПОЛЬЗУЕТСЯ В НАСТОЯЩИХ СЛУЧАЯХ.   -  person Giacomo Catenazzi    schedule 19.01.2019
comment
Сложность текста побуждает современные шифры не работать с символами. Они работают с байтами как для ввода, так и для вывода. Если вводится текст, получателю необходимо сообщить кодировку символов. Если дальнейшая обработка вывода должна осуществляться в виде текста, используется Base64 или аналогичный. Ожидать, что вывод шифра будет выглядеть как текст, обычно не является целью.   -  person Tom Blodget    schedule 19.01.2019
comment
@GiacomoCatenazzi В общем, нет ограничений на количество комбинируемых символов. потокобезопасный текстовый формат определяет не более 30 нестандартных форматов, кроме этого формата не обязательно.   -  person nwellnhof    schedule 19.01.2019
comment
@GiacomoCatenazzi Речь идет не о шифровании сообщения. Речь идет об игре с юникодом и исследовании его свойств. Что вы имеете в виду под фразой «Не все символы можно различить» (в приложении)? В некоторых сценариях, таких как арабский или деванагари, может показаться, что текст сливается в одну длинную единицу, но даже на этих языках есть печатные символы. Зашифрованная строка выглядит некрасиво, но это нормально, если ее можно распечатать. Кроме того, я не понимаю, как это имеет значение, что некоторые языки идут справа налево.   -  person Arimaafan    schedule 19.01.2019
comment
@GiacomoCatenazzi Если шифр основан на печатных символах, он должен работать, даже если часть текста на английском, а другая на арабском.   -  person Arimaafan    schedule 19.01.2019
comment
@nwellnhof AFAIK вы правы насчет бесконечности, но Юникод не используется на практике или предназначен для использования. क्षि (2325 2381 2359 2367) не является набором кодовых точек, которые, по мнению некоторых поставщиков шрифтов, должны отображаться как один символ. Кроме того, все блоки в Unicode были предназначены для использования для записи конечного набора печатаемых символов, хотя некоторые из них, например диакритические знаки, потенциально могут использоваться с еще не определенными будущими символами.   -  person Arimaafan    schedule 19.01.2019
comment
@GiacomoCatenazzi Вы правы в том, что одну и ту же графему иногда можно создать с помощью разных комбинаций кодовых точек. á может быть либо (225), либо (97 769). Такие символы обычно считаются идентичными для целей записи, и Perl6 даже нормализует их, превратив оба в (225). Это означает, что шифр должен уметь распознавать обе формы. Не думаю, что это слишком хлопотно. Все текстовые парсеры или шрифты должны делать то же самое.   -  person Arimaafan    schedule 19.01.2019
comment
@Arimaafan: существуют различные нормализации (и определены в юникоде). Вы также можете посмотреть нормализацию совместимости, чтобы увидеть некоторые символы, которые идентичны другим (но по этой причине не вся совместимость). Бета / СС, мю (греческая буква и единица) являются некоторыми примерами. Буква A может быть латинской или греческой (такой же верхний регистр, как B, X, K и т. Д.). Для указанного выше символа: это зависит от языка, если какой-либо символ может быть объединен (лигатура). Можно переопределить с помощью не-соединителя нулевой ширины (и соединителя нулевой ширины).   -  person Giacomo Catenazzi    schedule 20.01.2019
comment
Если вы хотите поиграть: несколько лет назад была страница, которая отображала весь код Unicode (и это показывает некоторые ошибки / сбои браузера). В Python есть модуль unicodedata (для получения свойств символов Юникода) [но вы найдете исходную базу данных в   -  person Giacomo Catenazzi    schedule 20.01.2019


Ответы (1)


TL; DR Я думаю, что ваш вопрос разумен и заслуживает лучшего ответа, чем тот, который я написал до сих пор. Давай поговорим.


Я не думаю, что кто-то может создать шифр Цезаря с указанными вами требованиями по нескольким причинам.

Но если ваша цель действительно «исследовать свойства Unicode», а не создавать шифр, то, по-видимому, это не имеет значения.

И, конечно же, я мог просто испытывать недостаток воображения или просто неспособность понять Unicode, несмотря на то, что я годами боролся с ним.

Если вы критикуете технические аспекты моего объяснения ниже в комментариях, я постараюсь улучшить его, и, надеюсь, мы оба узнаем по ходу дела. TIA.

«Шифр Цезаря со всеми печатаемыми символами Unicode»

Это чистая формулировка, которая есть в вашем заголовке.

Единственные проблемные части - это «Цезарь», «шифр», «все», «Юникод», «печатный» и «символы». Пойдем через них.

Шифр цезаря

Шифр Цезаря - это особенно простой шифр с одним алфавитом. Юникод - это не один большой единый алфавит. Но, возможно, вы могли бы рассматривать подмножество его кодовых точек, как если бы они были.

Я бы сказал, что в этом суть шифра со всеми символами Юникода SO.

В настоящее время вы отвергли это и представили кучу дополнительных аспектов, которые либо невозможны, либо настолько сложны, что с тем же успехом могут быть.

Игнорирование вашего приоритета исследования свойств Unicode имело бы смысл, если бы вы вместо этого остановились на обычном шифре ASCII. Или, возможно, вернитесь к этому Cipher со всеми символами Unicode SO и продолжите с того места, где они остановились, возможно, отметив это, согласно комментарий к этому SO, они явно остановились только на плоскости BMP:

Обратите внимание, что вы используете только кодовые точки BMP (например, от U + 0000 до U + FFFF). Unicode варьируется от U + 0000 до U + 10FFFF, так что вам не хватает около миллиона кодовых точек :)

Так что, возможно, вы могли бы сделать лучше. Я не думаю, что это было бы целесообразно с точки зрения создания шифра ради самого себя, но это могло быть сделано для того, чтобы больше узнать о свойствах Unicode.

Шифр

@TomBlodget в своем комментарии к вашему вопросу отмечает, что:

Сложность текста побуждает современные шифры не работать с символами. Они работают с байтами как для ввода, так и для вывода. Если вводится текст, получателю необходимо сообщить кодировку символов. Если дальнейшая обработка вывода должна осуществляться в виде текста, используется Base64 или аналогичный. Ожидать, что вывод шифра будет выглядеть как текст, обычно не является целью.

Если вам нужно универсальное решение для шифрования Unicode, следуйте рецепту Тома.

Все

В комментарии к вашему вопросу о количестве графем @nwellnhof отметил, что:

есть бесконечное число

Но тогда вы также вполне разумно ответили, что в любом данном тексте будет только конечное число; намерение Unicode состоит в том, что программное обеспечение, совместимое с Unicode, может / будет генерировать результаты mojibake, если задано вырожденное входное значение (где то, что считается вырожденным, в некоторой степени открыто для уточнения в обновлениях Unicode); и это основа, на которой вы надеетесь продолжить.

Это разумный ответ, но вы все равно не можете иметь «все», даже если ограничитесь «всеми невырожденными» и «только теми, которые могут появиться в реальной жизни», потому что по-прежнему существует фактически бесконечное количество хорошо сформированных и потенциально разумных символы.

Я действительно должен вставить здесь некоторые вычисления, чтобы поставить некоторые границы проблемы. Является ли «фактически бесконечным» триллион? Почему? Что-то в этом роде. Но прежде чем углубляться в это, я дождусь комментариев.

Давайте представим, что это триллион, и что это не проблема, и двинемся дальше.

Юникод

Юникод чрезвычайно сложен.

Вам дали задание создать шифр Цезаря, очень простая вещь.

Они действительно плохо сочетаются, если вы сильно не полагаетесь на простоту.

Но вы хотите исследовать свойства Unicode. Так что, возможно, вы хотите углубиться во все сложности. Но тогда возникает вопрос, сколько лет вы хотите потратить на изучение последствий открытия этого ящика Пандоры? (Я изучаю Unicode уже десять лет. Это сложно.)

Для печати

Вы связались с вопросом SO «Каков диапазон печатаемых символов Unicode?». Сюда входит ответ, в котором отмечается:

Чем больше вы узнаете о Юникоде, тем больше понимаете, насколько неожиданно разнообразны и непостижимо странные системы человеческого письма. В частности, не всегда очевидно, можно ли печатать тот или иной «персонаж».

Но вы, вероятно, прочитали это и отказались сдерживаться. Что одновременно и достойно восхищения, и напрашивается на неприятности. Например, вам кажется, что это заставило вас определить «печатный» как что-то вроде «требуется одно или несколько нажатий клавиш для перемещения», что настолько чревато, что трудно понять, с чего начать - так что я расскажу об этом позже. отвечать.

Символы

Учитывая, что ваша цель - написать шифр Цезаря, шифр, который использовался тысячи лет назад и воздействует на персонажей, имеет смысл сосредоточиться на том, «что пользователь думает о персонаже».

Согласно определению Unicode, это называется «графемой».

Один из ваших примеров символов проясняет, насколько проблематично различие между «тем, что пользователь думает о символе» (графема) и кодовой точкой (что Python считает символом):

print('क्षि'[::-1])
िष्क

Это показывает искажение одного «символа» (одной графемы), написанного на деванагари, который, согласно Википедии, является «одной из наиболее используемых и принятых систем письма в мире».

(Или, если мы хотим игнорировать половину планеты, на которую это искажение все чаще влияет, и просто сосредоточимся на людях, которые думали, что они в безопасности:

print('????????'[::-1])
????????

Это флаг одной нации, превращающийся в другой. К счастью, флаги редко появляются в тексте - хотя сейчас это меняется, текст становится все более произвольным. Текст Unicode, такой как этот текст, который я пишу, - и символы флагов не так важны, и Великобритания и Болгария являются членами ЕС, поэтому, вероятно, это не так. так же плохо, как перебирать текст миллиарда индейцев.)

Графемы

Итак, вы вполне резонно подумали: «Может, Perl 6 поможет».

Чтобы процитировать UAX # 29, документ приложения 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: Правильно ли приведенное выше определение того, что значит быть печатным символом в Юникоде?

Я так не думаю. Надеюсь, вышеизложенное объясняет почему или, по крайней мере, указывает вам направления, которые вам нужно исследовать (в течение года или трех), чтобы понять, почему.

2: ... знаете ли вы какой-либо список печатаемых символов, который покрывает используемые в настоящее время плоскости Юникода и возможные кластеры графем ...

Существует такое огромное количество «возможных кластеров графем», которые могут разумно возникнуть, что даже исключение вырожденных комбинаций кодовых точек оставляет вам фактически бесконечный список.

И любое небольшое подмножество, которое кто-либо может создать, не будет каноническим, потому что консорциум Unicode не благословит его, и люди будут спорить о том, что следует включить.

3: ... как бы вы создали такой список, с помощью которого я мог бы создать шифр Цезаря, который мог бы шифровать любые / все печатные символы при следующих 4 условиях?

Во-первых, у вас слишком тяжелые условия. См. Следующий раздел.

Но даже если вы отбросите те, которые слишком сложны, это все равно будет слишком сложно, а результат будет слишком неинтересным, чтобы делать что-либо стоящее.

4: Если вы думаете, что создание такого списка - ужасная идея, как бы вы создали шифр?

Если бы это был я, и это должен был быть шифр Цезаря, я бы заставил его просто обрабатывать байты, согласно комментарию Тома в начале этого ответа.

Ваши условия

Зашифрованная строка будет действительной строкой utf8, состоящей из стандартных кодовых точек Unicode (без неназначенных или частных кодовых точек).

Это должно быть более ограничено, но разумно сказать, что это должна быть действительная строка Unicode. Если вы хотите настоять на том, что это utf8, это тоже нормально.

Зашифрованная строка также должна быть допустимой строкой utf8, состоящей из стандартных кодовых точек Unicode.

Конечно.

Вы должны иметь возможность пройти по зашифрованной строке, используя то же количество штрихов ..., что и исходная строка

Вы можете использовать это для небольшого подмножества символов Unicode. Но...

Это означает [одно нажатие как для исходной, так и для закодированной версии] символа деванагари [क्षि]

... не является разумным требованием.

Вы могли бы обеспечить ту же интерпретацию кластеризации графем (символов) данного текста, если бы вы написали собственную реализацию кластеризации графем для своего шифра, которая была точной копией реализации кластеризации графем, используемой для управления курсором.

Но тогда вам придется поддерживать эти две кодовые базы, чтобы синхронизировать их. И это было бы только для одной конкретной конфигурации системы.

Было бы нелепо больно. И для нулевого или, самое большее, крошечного усиления.

строка, которая должна быть зашифрована, и строка, которая была расшифрована (конечный результат), должны содержать одни и те же кодовые точки (две строки должны быть равны).

Итак, никакой нормализации.

Это исключает все возможности Perl 6, связанные с графемами.

С другой стороны, вам все равно нужно перестать обращать внимание на графемы, потому что их фактически бесконечное количество.

Заключение

Мой ответ лишь слегка касается затрагиваемых тем и, вероятно, содержит много ошибок. Если вы критикуете, я постараюсь улучшить.

person raiph    schedule 20.01.2019
comment
Спасибо за Ваш ответ! (извините за поздний ответ. Неделя напряженная). Признаюсь, идея моего траверса была плохой. Мне нужно лучше определить, что значит быть характером. Отправной точкой для бога, вероятно, являются шрифты. Возьмите шрифты Google NOTO. Цель близка к моей: определить всех персонажей, которые могут быть видны на экране, и указать для них шрифт, чтобы люди могли избегать тофу ... - person Arimaafan; 27.01.2019
comment
... Вы писали: ... по-прежнему существует бесконечное количество хорошо сформированных и потенциально разумных символов. Шрифты не включают в себя такие вещи, как пробелы, но в остальном, как проекты, такие как Google NOTO, являются неполными? что они упускают? Afaik, они, в принципе, являются конечным набором для данной версии Unicode. - person Arimaafan; 27.01.2019
comment
@Arimaafan NOTO не является неполным. Это гарантирует, что все графемы отображаются без тофу. Все они. Я игнорирую проблему шрифтов и символов, потому что A) вы написали, предполагая, что у вас есть все необходимые шрифты, чтобы увидеть те, которые должны быть видны на экране, и B) это не проблема. - person raiph; 28.01.2019
comment
@Arimaafan Я написал, что мне действительно нужно вставить сюда некоторые расчеты, чтобы ограничить проблему. Действительно ли бесконечен триллион? ... Но прежде чем углубиться в это, я подожду комментариев. Вы прокомментировали, что я хочу взглянуть на это. Первый вопрос, который я рассмотрю на следующей неделе, - сколько существует относительно универсальных комбайнеров. say "A keycap grapheme: a\c[Combining Diaeresis, Combining Enclosing Keycap]" отображает A keycap grapheme: ä⃣. Комбайнер клавиш кажется обычным. Если бы таких универсальных объединителей было 10, заполненная таблица алфавита содержала бы около миллиарда графем. - person raiph; 28.01.2019
comment
@Arimaafan Похоже, существуют сотни, если не тысячи, того, что можно с полным основанием рассматривать как универсальные комбайнеры. Это, конечно, означает триллионы триллионов комбинаций даже после нормализации. Ресурсы, которые я читал по мере изучения, показывают множество других неразрешимых проблем, если бы кто-то попытался создать шифр удаленно, подобный тому, который вы описываете. Так что я собираюсь выручить на этом этапе. В следующем комментарии я оставлю ссылки на сайт Unicode и вопросы SO, которые привели меня к такому выводу. - person raiph; 04.02.2019
comment
На самом деле подойдут только эти двое. Во-первых, глава о свойствах символов стандарта Unicode. И один из нескольких SO, на которые стоит подписаться. - person raiph; 04.02.2019
comment
Я никогда раньше не слышал о комбайнерах, но судя по тому, что вы написали, я не вижу в них проблемы. Если у вас есть способ определить, какие символы можно комбинировать с помощью комбайнера, вы можете просто вычислить, какой индексный номер будет у символа + комбайнера в списке всех символов. Фактически, у вас просто есть своего рода ленивый список, из которого вы МОЖЕТЕ создать фактический список длиной в триллионы, если хотите. - person Arimaafan; 04.02.2019
comment
Комбинирование символов, таких как колпачок в моем комментарии выше или идеограммы, вызывает комбинаторный взрыв в количестве допустимых символов. Правила Юникода определяют, как они сочетаются. Айуи, прежде чем вы сможете запустить шифр Цезаря, вам нужно будет пойти дальше и сгенерировать все эти символы, чтобы вы могли удалить из них вырожденные, непечатаемые, небайтовые обратимые и т. Д. символы, которые затем будут участвовать в подмножестве алфавита, который будет алфавитом шифра Цезаря. Как ты можешь делать это лениво? Конечно, вам нужно построить весь алфавит, прежде чем вы сможете зашифровать один символ? - person raiph; 05.02.2019
comment
@Arimaafan И я полагаю, я не сказал явно, что эти характеристики (вырожденные, непечатаемые, небайтовые обратимые и т. Д.) Не могут быть определены вычислением. Им нужен человек, чтобы принять решение. Мы надеемся, что вырождение очевидно; весь смысл концепции в том, что вырожденный персонаж технически допустим, но люди не используют этот персонаж. Я думаю, вы думаете, что можете вывести печатную версию, опираясь на noto, и, возможно, вы правы, хотя я в этом сомневаюсь. Побайтовая обратимость потребовала бы почти бесконечных итераций, потому что она могла бы превратиться в технически допустимую вырожденную. И т.п. - person raiph; 09.02.2019