将Unicode字符分配给char

时间:2013-11-23 03:10:26

标签: c gcc ascii

我想做以下任务:

char complete = '█', blank='░';

但是我得到了以下警告(我正在使用最新版本的gcc):

trabalho3.c: In function ‘entrar’:
trabalho3.c:243:9: warning: multi-character character constant [-Wmultichar]
   char complete = '█', blank='░';
                    ^
trabalho3.c:243:3: warning: overflow in implicit constant conversion [-Woverflow]
   char complete = '█', blank='░';
                    ^
trabalho3.c:244:23: warning: multi-character character constant [-Wmultichar]
   char complete = '█', blank='░';
                             ^
trabalho3.c:244:17: warning: overflow in implicit constant conversion [-Woverflow]
   char complete = '█', blank='░';
                             ^

我该怎么做这个作业?

2 个答案:

答案 0 :(得分:2)

当我从发布中复制这些行并通过十六进制转储程序回显结果时,输出为:

0x0000: 63 68 61 72 20 63 6F 6D 70 6C 65 74 65 20 3D 20   char complete = 
0x0010: 27 E2 96 88 27 2C 20 62 6C 61 6E 6B 3D 27 E2 96   '...', blank='..
0x0020: 91 27 3B 0A                                       .';.
0x0024:

当我通过UTF-8解码器运行时,两个块字符被标识为:

0xE2 0x96 0x88 = U+2588 (FULL BLOCK)
0xE2 0x96 0x91 = U+2591 (LIGHT SHADE)

如果字符长度确实是3个字节,那么尝试将所有三个字节存储到单个字符中会导致问题。

您需要验证这些观察结果;在您的系统和我的系统之间过滤数据的可能性很大。但是,如果您使用类似的工具查看源代码,您可能会发现这些字符是UTF-8或UFT-16编码的,并且这些字符都不适合单个字节。如果您认为它们是单字节代码集中的字符(可能是CP-1252或类似代码集),则应显示包含初始化的代码行的十六进制转储,并标识您正在使用的平台和代码集用。

答案 1 :(得分:0)

您可以将这些字符存储为:

  • UTF-8字符串volatile
  • const unsigned char complete[] = u8"█";<wchar.h>
  • 中定义的广泛字符
  • const wchar_t complete = L'█';<uchar.h>
  • 中定义的UTF-32字符
  • 一个UTF-16角色,虽然这通常是一个坏主意。

尽可能使用UTF-8,必要时使用其他内容。 32位类型是唯一保证固定宽度的类型。标准库中有一些函数用于读取和写入宽字符串,在许多语言环境中,一旦调用const char32_t complete = U'█';或使用{{setlocale()将它们转换为宽字符,就可以读取和写入UTF-8字符串。 1}}。