【问题标题】:How to make a unicode variable in C?如何在 C 中创建一个 unicode 变量?
【发布时间】:2018-07-14 18:42:07
【问题描述】:

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

Unicode for Card symbols

#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,还是我想的那样不可能?

【问题讨论】:

  • Unicode 字符语法 os 是一个小问题,您可能需要跳过更多的环节。你在哪个平台上?

标签: c unicode utf-8 printf


【解决方案1】:

您处于一个不太常见的用例中,Basic Multilingual Plane 之外的 unicode 字符的 unicode 代码大于 U+FFFF。这些字符可以用大写的 U 前缀后跟 8 个十六进制字符以 C 字面形式表示,并转换为它们的 UTF8 表示形式。通常黑桃 A 是"\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 字符。

【讨论】:

    【解决方案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;    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多