Почему PDcurses показывает строки иначе, чем исходный файл и поток? - PullRequest
0 голосов
/ 09 июня 2018

Вот мой код 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 голосов
/ 09 июня 2018

gcc будет представлять аргумент во втором случае в виде массива wchar_t (с использованием префикса L"), в то время как fgetws возвращает массив wchar_t (либо UCS-2)или UCS-4, в зависимости от платформы: обычно первый, если вы используете Windows).

Однако данные, прочитанные из файла, могут быть различными , потому что:

  • порядок байтов отличается тем, что
  • функция fgetws ожидает (или не ожидает) метку порядка байтов
  • и фактические данные не совпадаютего ожидания.

Это различие можно увидеть по дампу (hexdump или od) файла данных и печати фактических данных, считанных / использованных в тестовой программе, в виде массива чисел.Поскольку эти широкие символы используют многобайтовую кодировку для своего внешнего представления, при несоответствии в порядке следования байтов вы увидите мусор.

Например, внешний файл может быть закодирован какUTF-8, в то время как (это звучит как MinGW), fgetws будет ожидать только UTF-16 (или наоборот).Но, начав с того, что вы точно увидите, как выглядят числа , вы увидите проблему.

...