gpt4 book ai didi

arrays - 有没有办法将 rune 打印为单个字符?

转载 作者:行者123 更新时间:2023-12-03 15:46:53 26 4
gpt4 key购买 nike

程序目的: rune 密码
最终编辑:
我现在(感谢 非常有用的 由 Extremely 提供的答案 了不起的人 )完成了我一直在从事的项目;并且 - 对于 future 的读者,我还提供了完整的代码。
再次,这个 不会在没有我从下面的人那里得到的所有帮助的情况下,这是可能的,感谢他们 - 再次 !
原码on 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;
}

Output:


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 ᛟ
ᛠᚣᚫᛞᛟ

问题在下面继续
(请注意,它已解决,请参阅已接受的答案!)
在 Python3 中很容易打印 rune :
for i in range(5794,5855):
print(chr(i))
产出


(..)
🛝

如何在 C 中做到这一点?
  • 使用变量(char、char 数组[]、int、...)

  • 有没有办法例如将 ᛘᛙᛚᛛᛜᛝᛞ 打印为单个字符?
    当我尝试时,它只是打印出关于多字符字符常量 'ᛟ' 的两个警告。 .
    我曾尝试将它们作为字符数组,一个“字符串”(例如 char s1 = "ᛟᛒᛓ";)
  • 然后打印出第一个(ᛟ) s1 的字符:printf("%c", s1[0]);现在,这在其他人看来可能是非常错误的。

  • 我如何考虑这样做的一个例子:
    将 rune 打印为“单个字符”:
    打印例如“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 - At GitHub
    Viewing Runes - At Unix&Linux SE
    junicode - At Sourceforge.io

    最佳答案

    作为(宽)字符的字符串存储在堆栈中
    如果你想将你的 rune (wchar_t) 添加到一个字符串中,那么你可以按照以下方式进行:
    使用 wcsncpy :(对char来说太过分了,感谢chqrlie的注意)

    #define UNICODE_BLOCK_START 0x16A0 // see wikipedia link for the start
    #define UUICODE_BLOCK_END 0x16F0 // true ending of Runic wide chars

    int main(void) {
    setlocale(LC_ALL, "");
    wchar_t buffer[UUICODE_BLOCK_END - UNICODE_BLOCK_START + sizeof(wchar_t) * 2];

    int i = 0;
    for (wchar_t wc = UNICODE_BLOCK_START; wc <= UUICODE_BLOCK_END; wc++)
    buffer[i++] = wc;
    buffer[i] = L'\0';

    printf("%ls\n", buffer);
    return 0;
    }

    关于宽字符(和 Unicode)
    更好地理解什么是 wide char ,您必须将其视为一组超出用于字符的原始范围 2^8 = 256 的位集。或者,使用 left shifting , 1 << 8 )。
    当您只需要打印键盘上的内容时就足够了,但是当您需要打印亚洲字符或其他 unicode 字符时,这已经不够了,这就是 Unicode standard 的原因。被创建。您可以在 wikipedia 上找到更多关于存在的非常不同和奇特的字符及其范围(命名为 unicode 块)的信息。 , 在你的情况下 runic .

    Range U+16A0..U+16FF - Runic (86 characters), Common (3 characters)


    注意:您的 rune 宽字符以 0x16F1 结尾,略早于 0x16FF(0x16F1 到 0x16FF 未定义)
    您可以使用以下函数将宽字符打印为位:
    void print_binary(unsigned int number)
    {
    char buffer[36]; // 32 bits, 3 spaces and one \0
    unsigned int mask = 0b1000000000000000000000000000;
    int i = 0;
    while (i++ < 32) {
    buffer[i] = '0' + !!(number & (mask >> i));
    if (i && !(i % 8))
    buffer[i] = ' ';
    }
    buffer[32] = '\0';
    printf("%s\n", buffer);
    }
    你在循环中调用:
    print_binary((unsigned int)wc);
    它将让您更好地了解宽字符在机器级别的表示方式:

    0000000 0000001 1101101 1100000

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

    关于arrays - 有没有办法将 rune 打印为单个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66401017/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com