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

时间:2018-06-09 06:36:23

标签: 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();
  return 0;
}

text.txt文件只是:

♠♣♥♦

第一个显示确定,但第二个只是一系列奇怪的角色。谁知道为什么?

1 个答案:

答案 0 :(得分:0)

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

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

  • 字节顺序不同,因为
  • wchar_t函数期望(或不期望)字节顺序标记
  • 并且实际数据与其预期不符。

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

例如,外部文件可能被编码为UTF-8(这听起来像MinGW),fgetws只能期望UTF-16(或反向)。但首先要确切地看到数字的样子会显示问题。