具有所有Unicode可打印字符的凯撒密码

时间:2019-01-19 16:24:52

标签: python unicode perl6 caesar-cipher

我想创建一个可以对整个Unicode(专用区域除外)中的Unicode可打印字符(单和多代码点字素簇,表情符号等)进行编码/解码的Caesar密码。最好使用所有可打印字符的列表。

注意:即使我想创建一个凯撒密码,它实际上也与加密无关。问题是关于调查unicode的属性。

我发现了以下问题:

What is the range of Unicode Printable Characters?

Cipher with all unicode characters

但是我没有得到想要的答案。

注意: 如果您给出编码答案,那么我对解决方案最感兴趣 使用python3或perl6,因为它们是我的主要语言。

最近,我被分配一份凯撒密码,然后对英语文本进行编码和解码。

我通过使用字符串库的内置string.printable常量在python中解决了该问题。这是常量的打印输出: (我使用了Visual Studio代码)

[请参见下面的python代码和结果]

文档说: ''' 视为可打印的ASCII字符字符串。这是数字,ascii_letters,标点符号和空格的组合。 ''' https://docs.python.org/3.6/library/string.html#string-constants

我想知道如何创建一个凯撒密码,以便对Unicode代码点上可以制作的所有可能的可打印字符进行编码/解码(假设您拥有所有必需的字体以查看应该在屏幕上看到的字体)。

h1>

这是我对这意味着什么的理解 可以打印的字符:

当我使用上面的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代码和结果]

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

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

0 个答案:

没有答案