首页 > 解决方案 > 如何在 C 中创建一个 unicode 变量?

问题描述

我想编写一个程序,如果用户输入 3s,程序可以在控制台中打印字符“”,用于输入 kh 输出“”,用于输入 10c 输出“”等。我有一个来自This Wikipedia page的 unicode 列表。

卡片符号的 Unicode

#include <stdio.h>
#include <string.h>

typedef struct card {
    int val;
    char suite;
} card;

void Take(card myCard[]);
void Display(card Cards[], int num);

void main()
{
    card myCards[13];
    int remaining = 13;
    printf("Enter you cards:");
    Take(myCards);
    printf("Your cards are:");
    Display(myCards, remaining);
    while(remaining > 0)
    {
        remaining--;
    }
}    

void Take(card myCard[])
{
    int i;
    for(i = 0; i < 13; i++)
        scanf("%d%c", &myCard[i].val, &myCard[i].suite); 
}

void Display(card cards[], int num)
{    
    char unicode[7];
    int i = 0; 
    for(i = 0; i < num; i++)
    {
        strcpy(unicode, "\u1F0");
        switch(cards[i].suite)
        {
            case 's':
                strcat(unicode, "A");
                break;    
            case 'h':
                strcat(unicode, "B");
                break;    
            case 'b':
                strcat(unicode, "C");
                break;    
            case 'c':
                strcat(unicode, "D");
                break;    
        }
        switch(cards[i].val)
        {
            case 10:
                strcpy(unicode, "A");
                break;
            case 11:
                strcpy(unicode, "B");
                break;
            case 12:
                strcpy(unicode, "D");
                break;
            case 13:
                strcpy(unicode, "E");
                break;    
            default:
                break;
        }
        printf("%s\t", unicode);
    }
}

unicode 中有一个模式为 \u1f0XY,其中从 A 到 D 的 x 更改套件,从 1 到 E 的 Y 更改卡的值。我的方法是创建一个名为 Unicode 的字符串,其初始值为“\u1f0”。然后根据卡片是什么套件,我将在字符串后面附加正确的 x,然后根据值,我将在 Unicode 字符串后面加上正确的 y。也就是说,我的方法是创建一个变量字符串,其中包含要打印的字符串的正确 Unicode。但我收到了这个错误

错误:不完整的通用字符名称 \u1F0 strcpy(unicode, "\u1F0");

我怎样才能正确地创建一个变量 Unicode,或者我想它做的方式是不可能的?

标签: cunicodeutf-8printf

解决方案


常量字符串文字是编译时的东西,它们的转义序列由编译器处理,不能在运行时设置。

在您的情况下,在案例中设置完整的 Unicode 字符可能更容易,而不是尝试分段构建它。

如在

switch(cards[i].suite)
{
    case 's':
        strcpy(unicode, "\u1F0A");
        break;    
    case 'h':
        strcpy(unicode, "\u1F0B");
        break;    
    case 'b':
        strcpy(unicode, "\u1F0C");
        break;    
    case 'c':
        strcpy(unicode, "\u1F0D");
        break;    
}

推荐阅读