0

文字列内の文字をランダム化する必要があるプログラムの一部がありますが、ASCII で文字をエンコードしないシステムにプログラムを移植できるようにする方法に興味があります。

現在、ASCII テーブルの値の範囲に対応するランダムな整数を割り当てるだけです。

「sizeof(int)」のようなことを行う方法と同様に、ランダムな文字の割り当てを安全にコーディングするにはどうすればよいでしょうか?

存在する各文字で静的配列を作成し、ランダムなインデックスから文字を割り当てることができることは知っていますが、別の方法があるかどうかを知りたいと思っていました.

4

1 に答える 1

0

C コードの文字エンコーディングは、使用されるデータに依存しません。

C コードの文字セットは、使用される可能性のある文字列のエンコーディングとは無関係です。EBCDIC または UTF-8 の文字列を操作する C コードを ASCII で簡単に作成できます。

uint32_t任意の文字に対して a で十分であると断言できますが、一度 UTF の世界に入ると、最大コード ポイントは '\U0010FFFF' ですが、複数のコード ポイントが文字を構成する場合があります。どの UTF にも多くの英数字があります。

コードが 0 ~ 9、AZ の 36 文字の英数字をランダム化するように制限されているとします。提案されているようにテーブル ルックアップを使用すると、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 に答える