一个字符有多少位信息?

How many bits of information are in a single character?

所以我有一个安全编程和测试作业的问题class。问题是考虑 Windows NT 或 UNIX shell 帐户。 "How many bits of information are possible in an eight-character password if any character can be used?" 所以在我看来,标准键盘上有 95 个可能的字符。但是一个字符中有多少 "bits of information" 不取决于编码吗? 我不是要答案,我只是需要帮助理解位字符部分,然后我可以自己算出数学。

您在 0x21-0x7E(含)范围内获得了 95。我们称这个号码为"nusable"。这是来自 ASCII 的所有标准可打印字符。它排除了 spaces/tabs/crs,等等。如果 "character" 确实是一个 C 字符类型(8 位),那么 nusable 就是 95。一些系统 do 允许在密码中嵌入空格, 所以要小心,因为这会将数字增加到 96,等等

如果 "character" 可以是任何 8 位字节值,则范围为 0x00-0xFF,nusable 为 256。

因此,假设没有其他编码,实际答案是 95。如果这是介绍 C 编程 class,这就是可能的答案。但是,再看一下写法,我认为这意味着nusable是256,尽管你不能通过键盘输入它。

从这一点开始,取 nusable 和密码中允许的 "characters" 个数(给定为 8),然后计算...

所以,如果您受限于 ASCII and/or 8 位,您可以到此为止。

UTF-8 和 UTF-16 使用 "codepoints",编码成字符串时可以有可变大小。请参阅 https://en.wikipedia.org/wiki/UTF-8 UTF-8 代码点在 0x000000-0x10FFFF 范围内(最大值为 1,111,112),编码时大小可在 1-4 字节之间变化。请注意,上面的 ASCII 字符直接映射到 UTF-8 代码点 0x00-0x7F,并且长度为一个字节。这是设计使然。

所以问题是: "character" 是 C "char" 类型吗:

(1) (char password[8])
还是 UTF-8 编码的字符串:
(2) (char password[n]) where "n" is large enough to contain 8 codepoints?
    The maximum would be n = 8 * 4
或在代码点中重述为:
(3) uint32_t password[8]

如果 "character" 表示代码点,那么查找 nusable 与您为 ASCII 所做的类似。但是,并非所有 UTF-8 代码点都可用。有些是无效的。有些是特殊的转义码。有些未分配并保留供将来使用(例如克林贡语,我们是否应该开发星际飞船 :-))。有些用于特殊符号,例如 "long dash"(例如“--”或“---”)。

因此,对于给定的编码,我们需要找出可使用的。它们可以是任何语言(例如英语、斯瓦希里语、中文、德语全部混合)还是您必须假设给定的语言限制(例如德语的可用代码点比中文少得多)?对奇怪的东西的代码点有任何限制吗?

Windows使用wchar_t(16位)实现变长UTF-16编码。它与 UTF-8 的编码方式不同,但代码点范围相似。

如果物理存储大小可以变化以允许 8 个代码点 [上面的情况 (2) 或情况 (3)],请使用 nusable 并进行数学计算 [就像上面的 ASCII]。

如果物理存储是固定的[情况 (1)],这会变得很难看。此外,class 练习不太可能。我们会尝试将可变长度的 UTF-8 编码字符串塞入固定长度的字符串区域。我们需要将长度为 1(例如 95)、长度 2、...、长度 4 的所有可用代码点计数到长度为 5 的向量中(例如 int lenlist[5])。然后,计算最终答案就变成了最短路径、树行走等方面的问题。我们需要枚举变量的所有可能组合 lengths.This 需要对所有可能位置的可能长度组合进行计算,以使其不超过 8。这些不是您要查找的机器人。 ..