0

我有一个程序的一部分,我需要随机化字符串中的字符,但我对如何以这种方式执行此操作感兴趣,以便程序可移植到可能无法使用 ASCII 编码字符的系统。

目前我只是分配与 ASCII 表中的一系列值相对应的随机整数。

类似于你如何做类似'sizeof(int)'的事情,你如何安全地编码一个随机字符的分配?

我知道您可以创建一个包含每个字符的静态数组,并从随机索引中分配一个字符,但我很想知道是否有替代方案。

4

1 回答 1

0

C 代码字符编码是独立于数据是可以使用的。

C 代码的字符集独立于它可能使用的潜在字符串的编码。人们可以很容易地用 ASCII 编写 C 代码来处理 EBCDIC 或 UTF-8 字符串。

对于任何给定的字符,可以断言 auint32_t就足够了,但是一旦进入 UTF 世界,尽管最大代码点是 '\U0010FFFF',多个代码点可能组成一个字符。任何 UTF 也有很多字母数字字符。

假设代码被限制为随机化的 36 个字母数字字符:0-9,AZ。按照建议使用表查找将在有限的情况下适用于各种编码,如 ASCII、EBCDIC、UTF-8、UTF16-BE、UTF16-BE、UTF32-BE、UTF32-BE。每个表条目都需要使用显式值并以独立于字节序的方式。考虑如下小端。

typedef enum eEncoding {
  eASCII,
  eUTF16BE,
  eUTF16LE,
  ...
  eEncoding_N
};
unit8_t Table[eEncoding_N][36][5];
Table[eASCII][10 /* A */] = { 48, 0, 0, 0, 1 /* Length */ }
Table[eASCII][11 /* B */] = { 49, 0, 0, 0, 1 /* Length */ }
Table[eEBCIDIC][10]       = {193, 0, 0, 0, 1 /* Length */ }
Table[eUTF16BE][10]       = {  0,48, 0, 0, 2 /* Length */ }
Table[eUTF16LE][10]       = { 48, 0, 0, 0, 2 /* Length */ }
...
于 2013-10-04T15:57:10.437 回答