#unicode #obfuscation #zalgo #ascii-text #encoded-string

no-std bin+lib zalgo-codec

将 ASCII 文本字符串转换为单个 Unicode 图形簇,反之亦然。提供宏,用于嵌入已按此方式编码的 Rust 源代码。

39 个版本 (11 个破坏性版本)

0.12.0 2024 年 6 月 29 日
0.10.4 2024 年 1 月 14 日
0.10.1 2023 年 12 月 21 日
0.9.2 2023 年 11 月 28 日
0.3.2 2022 年 11 月 20 日

#171 in 文本处理

Download history 426/week @ 2024-04-26 1/week @ 2024-05-03 125/week @ 2024-05-31 129/week @ 2024-06-07 62/week @ 2024-06-14 14/week @ 2024-06-21 160/week @ 2024-06-28 102/week @ 2024-07-05 320/week @ 2024-07-26 22/week @ 2024-08-02

每月 342 次下载

MIT/Apache

120KB
1.5K SLoC

Latest Version docs.rs Build Status codecov

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许可证定义,将按上述方式双重授权,不附加任何其他条款或条件。

依赖项

~0–20MB
~311K SLoC