【问题标题】:Why PDcurses shows strings differently from source file and stream?为什么 PDcurses 显示的字符串与源文件和流不同?
【发布时间】:2018-11-19 03:53:59
【问题描述】:

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

♠♣♥♦

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

【问题讨论】:

  • 您是否尝试设置语言环境?
  • 平台可能是相关的
  • hmm 可能 C 编译器在文字中不使用 UTF-8
  • 感谢 cmets!我正在使用 Windows 10 中的 MinGW 并在 Atom 中编辑 c 文件。

标签: c stream ncurses widechar pdcurses


【解决方案1】:

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

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

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

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

例如,外部文件可能被编码为 UTF-8,而(这听起来像 MinGW),fgetws 只需要 UTF-16(或相反)。但是,首先查看数字的确切外观会告诉您问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2022-08-18
    • 2011-09-10
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多