如何在C中制作unicode变量?

时间:2018-07-14 18:42:07

标签: c unicode utf-8 printf

我想编写一个程序,如果用户输入3s,则该程序可以在控制台中打印字符“”,输入kh输出“”,输入10c输出“”等。我有{ {3}}。

This Wikipedia page

#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或以我认为的方式不可能?

2 个答案:

答案 0 :(得分:2)

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

在您的情况下,在这种情况下设置完整的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;    
}

答案 1 :(得分:1)

在一个不常见的用例中,Basic Multilingual Plane之外的Unicode字符的Unicode代码大于U + FFFF。这些字符可以在C语言中用大写U前缀表示,后跟8个六字符,并以其UTF8表示形式进行转换。通常,黑桃的王牌为"\U0001FA01""\xf0\x9f\x82\xa1"。您的所有卡都将具有2个相同的公共起始字节,只有后两个会有所不同。知道它并知道UTF-8编码的工作原理后,就可以这样编写Display函数:

void Display(card cards[], int num)
{    
    char unicode[7] = "\U0001FA00";
    int i = 0; 
    for(i = 0; i < num; i++)
    {
        switch(cards[i].suite)
        {
            case 's':
                unicode[2] = 0x82;
                unicode[3] = 0xA0;
                 break;    
            case 'h':
                unicode[2] = 0x82;
                unicode[3] = 0xB0;
                break;    
            case 'b':
                unicode[2] = 0x83;
                unicode[3] = 0x80;
                break;    
            case 'c':
                unicode[2] = 0x83;
                unicode[3] = 0x90;
                break;    
        }
        unicode[3] += cards[i].val;
        if(cards[i].val >= 12)
        {
            unicode[3] += 1;
        }
        printf("%s\t", unicode);
    }
}

我无法真正测试显示,因为我的终端只能显示BMP中的unicode字符。