为什么PDcurses显示的字符串与源文件和流不同?

为什么PDcurses显示的字符串与源文件和流不同?,c,stream,ncurses,widechar,pdcurses,C,Stream,Ncurses,Widechar,Pdcurses,这是我的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()

这是我的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文件只是:

♠♣♥♦

第一个显示ok,但第二个只是一系列奇怪的角色。有人知道为什么吗?

gcc将第二种情况下的参数表示为
wchar\u t
数组(使用
L“
前缀),而
fgetws
返回
wchar\u t
数组(UCS-2或UCS-4,取决于平台:如果使用Windows,通常是前者)

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

  • 字节顺序不同,这可能是因为
  • fgetws
    函数需要(或不需要)字节顺序标记
  • 而实际数据与预期不符
您可以通过数据文件的转储(hextump或od)并将测试程序中读取/使用的实际数据打印为数字数组来看到这种差异。由于这些宽字符使用多字节编码作为其外部表示形式,如果字节顺序不匹配,您将看到垃圾


例如,外部文件可能被编码为UTF-8,而
fgetws
只需要UTF-16(或相反).但是,从查看数字的确切外观开始,就会发现问题所在。

您尝试过设置区域设置吗?平台可能与此相关。嗯,可能C编译器在文字上不执行UTF-8。谢谢您的评论!我正在使用Windows 10中的MinGW,并在Atom中编辑C文件。