有没有办法将符文打印为单个字符?

Wil*_*ens 10 c arrays string char

程序目的:符文密码

最终编辑:

我现在(感谢极端惊人的人提供的非常有用的答案)完成了我一直在做的项目;并且 - 对于未来的读者,我还提供了完整的代码。

再一次,如果没有我从下面的人那里得到的所有帮助,这是不可能的,感谢他们 -再一次

GitHub 上的原始代码

代码

(缩短了一点)

#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#define UNICODE_BLOCK_START 0x16A0
#define UUICODE_BLOCK_END   0x16F1

int main(){
  setlocale(LC_ALL, "");
  wchar_t SUBALPHA[]=L"??????????????????????????";
  wchar_t DATA[]=L"hello";
  
    int lenofData=0;
    int i=0;

    while(DATA[i]!='\0'){
          lenofData++;  i++;
          }

  for(int i=0; i<lenofData; i++) {
      printf("DATA[%d]=%lc",i,DATA[i]);
      DATA[i]=SUBALPHA[i];
      printf(" is now Replaced by %lc\n",DATA[i]); 
      }        printf("%ls",DATA);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

DATA[0]=h is now Replaced by ?
DATA[1]=e is now Replaced by ?
DATA[2]=l is now Replaced by ?
DATA[3]=l is now Replaced by ?
DATA[4]=o is now Replaced by ?
?????
Run Code Online (Sandbox Code Playgroud)

问题在下面继续

(请注意,它已解决,请参阅已接受的答案!)

在 Python3 中很容易打印符文:

for i in range(5794,5855):
print(chr(i))
Run Code Online (Sandbox Code Playgroud)

产出

? ? (..) ? ?

如何在 C 中做到这一点?

  • 使用变量(char、char 数组[]、int、...)

有没有办法例如打印???????作为个人角色?

当我尝试它时,它只是打印出关于 multi-character character constant 的两个警告'?'

我曾尝试将它们作为字符数组,“字符串”(例如 char s1 = "???";)

  • 然后打印出(?)s1的第一个字符:printf("%c", s1[0]);现在,这在其他人看来可能是非常错误的。

我如何考虑这样做的一个例子:

将符文打印为“单个字符”:

打印例如“A”

  • printf("%c", 65); // 'A'

我该怎么做,(如果可能)但是使用 Rune ?

我也尝试将它的数字值打印到字符,这会导致问号,以及 - 其他“未定义”结果。

由于我不太记得到目前为止我尝试过的所有事情,我会尽力制定这篇文章。

如果有人发现一个很容易(也许,对他/她 - 甚至是显而易见的)解决方案(或技巧/解决方法) -

如果你能指出来,我会非常高兴!谢谢!

这已经困扰了我很长一段时间,但它python仍然有效 -c如果你只是“打印”它(而不是通过任何变量)它(据我所知)它printf("?"); 有效,但是,例如:这有效,但正如我所说我想做同样的事情,但是,通过变量。(比如,char runes[]="??";)然后:printf("%c", runes[0]); // to get '?' as the output

(或类似的,它不需要是%c,也不需要是字符数组/字符变量)我只是想了解如何 - 执行上述操作,(希望不会太难读)

我在 Linux 上,使用 GCC。

外部链接

Python3 Cypher's - 在 GitHub

查看符文 - 在 Unix&Linux SE

junicode - 在 Sourceforge.io

Ant*_*REL 3

作为(宽)字符的字符串存储在堆栈中

\n

如果您想将符文 (wchar_t) 添加到字符串中,则可以按照以下方式进行:

\n

使用wcsncpy:(对 char 来说太过分了,感谢 chqrlie 的注意)

\n
#define UNICODE_BLOCK_START 0x16A0 // see wikipedia link for the start\n#define UUICODE_BLOCK_END   0x16F0 // true ending of Runic wide chars\n\nint main(void) {\n  setlocale(LC_ALL, "");\n  wchar_t buffer[UUICODE_BLOCK_END - UNICODE_BLOCK_START + sizeof(wchar_t) * 2];\n\n  int i = 0;\n  for (wchar_t wc = UNICODE_BLOCK_START; wc <= UUICODE_BLOCK_END; wc++)\n    buffer[i++] = wc;\n  buffer[i] = L\'\\0\';\n\n  printf("%ls\\n", buffer);\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

关于宽字符(和 Unicode)

\n

为了更好地理解什么是宽字符,您必须将其视为一组超出用于字符的原始范围的位集,即2^8 = 256或,左移1 << 8)。

\n

当您只需要打印键盘上的内容时,它就足够了,但是当您需要打印亚洲字符或其他 Unicode 字符时,它就不够了,这就是创建Unicode 标准的原因。根据您的情况,您可以在维基百科上找到有关存在的非常不同和奇异字符的更多信息,以及它们的范围(命名的 unicode 块)runic

\n
\n

范围 U+16A0..U+16FF - 符文(86 个字符)、通用字符(3 个字符)

\n
\n

注意:您的 Runic 宽字符以 0x16F1 结尾,稍早于 0x16FF(0x16F1 到 0x16FF 未定义)

\n

您可以使用以下函数将宽字符打印为位:

\n
void print_binary(unsigned int number)\n{\n    char buffer[36]; // 32 bits, 3 spaces and one \\0\n    unsigned int mask = 0b1000000000000000000000000000;\n    int i = 0;\n    while (i++ < 32) {\n        buffer[i] = \'0\' + !!(number & (mask >> i));\n        if (i && !(i % 8))\n            buffer[i] = \' \';\n    }\n    buffer[32] = \'\\0\';\n    printf("%s\\n", buffer);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您在循环中调用:

\n
print_binary((unsigned int)wc);\n
Run Code Online (Sandbox Code Playgroud)\n

它将使您更好地了解宽字符在机器级别的表示方式:

\n
               \xe1\x9b\x9e\n0000000 0000001 1101101 1100000\n
Run Code Online (Sandbox Code Playgroud)\n
\n

注意:您需要注意细节:不要忘记最后的L\'\\0\',您需要使用%ls来获取输出printf

\n

  • 为了与 Unicode 块定义和“buffer”“wchar_t”数组的大小保持一致,“UUICODE_BLOCK_END”应该是最后一个符文字符的代码点(“0x16F0”或可能“0x16F8”),并且测试应该是“wc &lt; = UUICODE_BLOCK_END` (2认同)