C代表UTF-8 multichar

时间:2018-03-20 01:32:57

标签: c utf-8

我正在尝试将块字符(█,U + 2588)存储在char变量中。

#include "stdio.h"

int main(void) {
  char block = '█';
  printf("Without storage: █\n");
  printf("With storage: %c\n", block);
}

但它给了我警告

main.c: In function 'main':
main.c:4:20: warning: multi-character character constant [-Wmultichar]
       char block = '█';
                    ^~~~~
main.c:4:20: warning: overflow in implicit constant conversion [-Woverflow]

代码输出:

Without storage: █
With storage: �

'with storage'未知可能是由于char溢出而且仅代表该角色的一半。

我知道块字符可能是UTF-8 multichar,那么有人如何代表UTF-8 multichar而没有任何警告?

1 个答案:

答案 0 :(得分:1)

这是一个广泛的角色,因此需要一个不同的类型。在这种情况下,wchar_t是更好的选择,但仅此一项不会这样做,您需要将常量本身标记为宽字符。例如:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
int main()
{
   char c='A';
   wchar_t wc=L'█';

   printf("d%lcd d█d\n",wc); 
   puts("end");

   exit(EXIT_SUCCESS);
}

宽字符常量的标记为L(单个字符或字符串),并分别打印%lc%ls。但仅凭这一点并没有为我做,第二个printf仍然没有印刷。这是控制台本身的问题,设置区域设置有帮助(至少对我而言)

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <locale.h>
int main()
{
   char c='A';
   wchar_t wc=L'█';
   setlocale(LC_CTYPE, "");
   printf("%c d█d\n",c);
   printf("d%lcd d█d\n",wc); 
   puts("end");

   exit(EXIT_SUCCESS);
}