我想创建一个可以对整个Unicode(专用区域除外)中的Unicode可打印字符(单和多代码点字素簇,表情符号等)进行编码/解码的Caesar密码。最好使用所有可打印字符的列表。
注意:即使我想创建一个凯撒密码,它实际上也与加密无关。问题是关于调查unicode的属性。
我发现了以下问题:
但是我没有得到想要的答案。
注意: 如果您给出编码答案,那么我对解决方案最感兴趣 使用python3或perl6,因为它们是我的主要语言。
最近,我被分配一份凯撒密码,然后对英语文本进行编码和解码。
我通过使用字符串库的内置string.printable常量在python中解决了该问题。这是常量的打印输出: (我使用了Visual Studio代码)
文档说: ''' 视为可打印的ASCII字符字符串。这是数字,ascii_letters,标点符号和空格的组合。 ''' https://docs.python.org/3.6/library/string.html#string-constants
这是我对这意味着什么的理解 可以打印的字符:
当我使用上面的python字符串常量时, 并使用向左或绑定箭头键遍历 在键盘上,我需要100笔 到末尾(与字符数相同)。 看起来像一对一 可打印之间的对应关系 字符,并且只需轻按一下箭头键即可遍历。
现在考虑以下字符串:
“ ij क्षि“
基于python的string.printable常量, 在我看来,这串是由 以下7个可打印字符: (您可以在以下位置查找各个代码点:https://unicode-table.com/en/)
1(家庭)2(拉丁文小结带Ij) 3(回程)4(Devanagari kshi) 5(空间)6(零宽度无中断空间) 7(黑桃王牌)
码点:128104 8205 128105 8205 128103 8205 128102 (参考:https://emojipedia.org/family-man-woman-girl-boy/)
(拉丁文小结扎Ij) ij 代码点:307
(回车) 代码点:13
(Devanagari kshi)
क्षि
码点:2325 2381 2359 2367
(请参见本页:http://unicode.org/reports/tr29/)
(代码点似乎是十六进制而不是数字)
(空格) 代码点:32
(零宽度无中断空间) 编码点:65279 (又名U + FEFF字节顺序标记(BOM)) (https://en.wikipedia.org/wiki/Byte_order_mark)
(黑桃纸牌A) 代码点:127137
当我粘贴此 串入记事本,然后尝试使用箭头键遍历它, 我最终使用了10个按键而不是7个 因为家庭表情符号需要 4个按键 (可能是因为记事本无法处理零宽度连接符, 代码点:8205,当然记事本也不能显示家庭字形)。 另一方面,当我将字符串发布到Google搜索中时, 我可以用7个笔画遍历整个字符串。
然后我尝试创建字符串 在Perl6中查看Perl6的字素 意识将使字符串:
(我使用Atom编辑器)
perl6认为梵文kashi字符사्षि(4个代码点) 实际上是2个字素,每个字素都有2个代码点。 即使可以表示为两个字符, 如以上列表所示, 我认为这是一个错误。 Perl6应该是字素 知道,甚至我的Windows记事本(和Google搜索) 认为这是一个单一的字素/字符。
基于2个字符串, 的实际定义 一个可打印的字符似乎是这样的: '它是可以遍历的Unicode代码点的任意组合 一按键盘上的向左或向右箭头键 在理想的情况下”。
“理想情况下”表示 可以说,您所使用的环境是 像Google搜索一样: 也就是说,它可以识别例如表情符号 (四人家庭)或字素簇 (devanagari角色) 作为一个可打印字符。
3个问题:
1: 以上是对它的含义的合理定义吗 成为Unicode中的可打印字符?
2: 不管您是否接受该定义, 你知道任何可打印字符的列表吗 涵盖当前使用的unicode平面,并且可能 字素簇,而不仅仅是100个ASCII字符 python字符串库具有 (如果我有这样的列表,我想我可以创建一个密码 很容易)?
3: 鉴于这样的列表不存在,您 接受定义, 您将如何创建这样的列表, 我可以创建一个凯撒密码 可以加密任何/所有可打印内容 字符具有以下4个条件?
注意:这四个条件只是 我所想的是适当的 凯撒密码。
条件a
要加密的字符串将 是由标准组成的有效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
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!“#$%&'()* +,-。/ :; <=>?@ [] ^ _`{|}〜
类'str'
100
[128104 8205 128105 8205 128103 8205 128102 307 13 2325 2381 2359 2367 32 65279 127137]
ij क
8
(“” “,”ij“,” \ r“,”क्“,”षि“,”“,”“,”“)。Seq