0

这是我的 C 代码:

int main(){
  _setmode(_fileno(stdout), _O_U16TEXT);
  FILE* myFile = fopen("text.txt", "r");
  wchar_t line[100];
  fgetws(line,100,myFile);
  clear();
  initscr();
  addwstr(L"♠♣♥♦\n");
  addwstr(line);
  refresh();
  getchar();
  endwin();
  return 0;
}

text.txt 文件只是:

♠♣♥♦

第一个显示还可以,但第二个只是一系列奇怪的字符。有人知道为什么吗?

4

1 回答 1

0

gcc 将在第二种情况下将参数表示为一个数组wchar_t(使用L"前缀),同时fgetws返回一个数组wchar_t(UCS-2 或 UCS-4,具体取决于平台:如果您使用的是 Windows,通常是前者)。

但是,从文件中读取的数据可能会有所不同,因为:

  • 字节顺序不同,这是因为
  • fgetws函数期望(或不期望)字节顺序标记
  • 而实际数据并不符合其预期。

您可以通过数据文件的转储(hexdump 或 od)并将测试程序中读取/使用的实际数据打印为数字数组来看到这种差异。由于这些宽字符对其外部表示使用多字节编码,因此如果字节顺序不匹配,您将看到垃圾。

例如,外部文件可能被编码为 UTF-8,而(这听起来像 MinGW),fgetws则只需要 UTF-16(或相反)。但是从确切地看到数字的样子开始会告诉你问题所在。

于 2018-06-09T11:18:50.937 回答