39 个版本 (11 个破坏性版本)
0.12.0 | 2024 年 6 月 29 日 |
---|---|
0.10.4 | 2024 年 1 月 14 日 |
0.10.1 | 2023 年 12 月 21 日 |
0.9.2 |
|
0.3.2 | 2022 年 11 月 20 日 |
#171 in 文本处理
每月 342 次下载
120KB
1.5K SLoC
zalgo codec
此 crate 允许您将 ASCII 文本字符串转换为单个 Unicode 图形簇,反之亦然。它还提供了一个过程宏,允许您将已转换为此类图形簇的源代码编译成好像从未被 zalgo 化一样。这使得您在自文档化代码的领域达到新的低点。
编码的字符串在字节大小上将是原始的 ~2 倍。
此外,该 crate 还提供了一个函数来编码 Python 代码,并将结果包装在一个解码器中,解码器解码并执行它,以便结果保留原始代码的功能。
示例
使用 zalgo_encode
将字符串编码为图形簇
let s = "Zalgo";
let encoded = zalgo_encode(s)?;
assert_eq!(encoded, "É̺͇͌͏");
使用 zalgo_decode
将图形簇解码回字符串
let encoded = "É̺͇͌͏";
let s = zalgo_decode(encoded)?;
assert_eq!(s, "Zalgo");
ZalgoString
类型可用于编码字符串并以各种方式处理结果
let s = "Zalgo";
let zstr = ZalgoString::new(s)?;
assert_eq!(zstr, "É̺͇͌͏");
assert_eq!(zstr.len(), 2 * s.len() + 1);
assert_eq!(zstr.decoded_len(), s.len());
assert_eq!(zstr.bytes().next(), Some(69));
assert_eq!(zstr.decoded_chars().next_back(), Some('o'));
我们可以使用宏 zalgo_embed!
执行 zalgo 编码的 rust 代码
// This expands to the code
// `fn add(x: i32, y: i32) -> i32 {x + y}`
zalgo_embed!("E͎͉͙͉̞͉͙͆̀́̈́̈́̈̀̓̒̌̀̀̓̒̉̀̍̀̓̒̀͛̀̋̀͘̚̚͘͝");
// The `add` function is now available
assert_eq!(add(10, 20), 30);
以及评估表达式
let x = 20;
let y = -10;
// This expands to the code
// `x + y`
let z = zalgo_embed!("È͙̋̀͘");
assert_eq!(z, x + y);
我们还可以执行与 obfstr 相反的操作:在编码时混淆字符串,并在编译时解混淆它
let secret_string = zalgo_embed!("Ê̤͏͎͔͔͈͉͓͍̇̀͒́̈́̀̀ͅ͏͍́̂");
assert_eq!(secret_string, "Don't read this mom!");
本节底部的诅咒字符是使用此 crate 中的编码函数编码的标准 "Lorem ipsum"。
E̬͏͍͉͓͕͍͒̀͐̀̈́ͅ͏͌͏͓͉͔͍͔͒̀̀́̌̀̓ͅ͏͎͓͔͔͕͉͉͓͉͎͇͉͔͓̓͒̀́̈́͐̓̀͌̌̀̈́̀̈́ͅͅͅͅ͏͉͕͓͍̀ͅ͏͔͍̈́̀͐ͅ͏͉͎͉͉͕͎͔͕͔͒̀̓̈́̈́̀̀͌́͂͏͔͒̀̀̈́ͅͅ͏͌͏͍͇͎͉͒̀́́̀́͌ͅ
说明
Unicode Latin中的字符U+0300–U+036F是组合字符。组合字符的有趣之处在于,您可以添加任意数量的这些字符到原始字符中,而不会创建任何新的符号,它只是将符号添加到字符上方。它本应用于创建如á
之类的字符,通过将一个普通的a
字符加上另一个字符来赋予它标记(在这种情况下是U+301)。有趣的事实是,Unicode没有对这些字符的数量进行任何限制。方便的是,这给了我们112个不同的字符可以映射,这很好地映射到ASCII字符范围0x20 -> 0x7F,即所有非控制字符。唯一的问题是,我们无法在这个系统中添加换行符,所以为了解决这个问题,我们可以简单地将0x7F(DEL)映射到0x0A(LF)。这可以表示为(CHARACTER - 11) % 133 - 21
,并使用(CHARACTER + 22) % 133 + 10
进行解码。
编码器实验
有一个可执行文件可用于在文本和文件上实验编码器。它还可以用于从源代码生成用于zalgo_embed!
的字符集群。可以使用以下命令安装:cargo install zalgo-codec --features binary
。在安装过程中,您可以选择启用gui
功能,以包括程序的简单GUI模式。
链接
该库基于Scott Conner最初用Python编写的编码和解码函数(原始链接),它们首次在这篇文章中与上述解释一起展示。
许可证
以下任一许可证下授权:
- Apache许可证2.0版本(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证定义,将按上述方式双重授权,不附加任何其他条款或条件。
依赖项
~0–20MB
~311K SLoC