Windows上的MinGW + GCC和UTF-8字符

Hen*_*ias 3 c windows gcc cmd utf-8

我遇到了GCC编译器和Windows CMD的问题,因为我无法正确看到UTF-8字符.我有以下代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char caractere;
  int inteiro;
  float Float;
  double Double;

  printf("Tipo de Dados\tNúmero de Bytes\tEndereço\n");
  printf("Caractere\t%d bytes \t em %d\n", sizeof(caractere), &caractere);
  printf("Inteiro\t%d bytes \t em %d\n", sizeof(inteiro), &inteiro);
  printf("Float\t%d bytes \t\t em %d\n", sizeof(Float), &Float);
  printf("Double\t%d bytes \t em %d\n", sizeof(Double), &Double);

  printf("Caractere: %d bytes \t em %p\n", sizeof(caractere), &caractere);
  printf("Inteiro: %d bytes \t em %p\n", sizeof(inteiro), &inteiro);
  printf("Float: %d bytes \t\t em %p\n", sizeof(Float), &Float);
  printf("Double: %d bytes \t em %p\n", sizeof(Double), &Double);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令:

gcc pointers01.c -o pointers
Run Code Online (Sandbox Code Playgroud)

我没有得到任何编译错误.但是当我执行生成的文件(.exe)时,它不显示UTF-8字符:

Tipo de Dados   N??mero de Bytes    Endere?ºo
Caractere   1 bytes      em 2686751
Inteiro 4 bytes      em 2686744
Float   4 bytes          em 2686740
Double  8 bytes      em 2686728
Caractere: 1 bytes   em 0028FF1F
Inteiro: 4 bytes     em 0028FF18
Float: 4 bytes       em 0028FF14
Double: 8 bytes      em 0028FF08
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?谢谢.

dev*_*fan 5

可悲的是,Windows控制台对UTF-8的支持非常有限且有缺陷.

可以做什么:将代码页设置为65001并使用支持它的一种字体,例如."Lucida控制台".代码页可以通过命令设置,chcp或者在C/C++中由函数设置SetConsoleOutputCP; 字体设置为SetCurrentConsoleFontEx.

但是,存在一些主要(和次要)问题.轻微第一:

a)这些功能对一个会话有效,即.如果稍后再次运行程序,则必须再次设置.理论上可以将其设置为默认值,但不推荐使用,因为它会影响所有控制台程序并将下面的问题引入它们,即使它们没有对代码页执行任何操作也不会编写以减轻问题.

b)如果控制台没有打开控制台,但是你从现有的控制台启动它,它将影响它之后的任何运行,直到该控制台关闭.因此,您必须在自己的程序退出之前将其更改回默认值.

c)某些可用于控制台输入/输出的功能无法与CP65001一起正常工作.
(这是最严重的事情)

与Windows的整个UTF16部分不同,它部分地将UTF8视为任何1字节字符集,并且做了一些奇怪的事情,恰好满足了1byte字符集的标准,但实现方式不同.

例如,fread应该返回读取的字节数(如果调用大小为1),但在Microsofts实现中,它确实返回字符数(UTF16是一个例外,但不是UTF8).对于任何正常的代码页,它将起作用,因为1char = 1byte,但不是UTF8 ...错误的返回值=>错误的数据处理

另一个例子,fflush可以挂起(至少报告,没有检查).etc.etc.
它不仅影响标准的C函数,而且直接调用Winapi函数.

d)作为c)的结果,所有具有UTF-8字符(正常ASCII范围除外)的批处理文件都不能正常工作,至少在某些Windows版本中(不检查每一个,但很可能Win10仍然有这个错误.MS显示无意很快修复它.)

c和d的更多内容:https://social.msdn.microsoft.com/Forums/vstudio/en-US/e4b91f49-6f60-4ffe-887a-e18e39250905/possible-bugs-in-writefile-and-crt- Unicode的问题?论坛= vcgeneral