Вызывается ReadFile для текстового файла, есть странные (японские?) Символы - PullRequest
3 голосов
/ 12 марта 2011

Я использую следующий код для чтения всех элементов из файла с работающим дескриптором hFile и с его размером, который я получил с GetFileSize(hFile, NULL).

_TCHAR* text = (_TCHAR*)malloc(sizeOfFile * sizeof(_TCHAR));
DWORD numRead = 0;
BOOL didntFail = ReadFile(hFile, text, sizeOfFile, &numRead, NULL);

после операции text - это какая-то странная вещь на японском языке или что-то в этом роде, а не содержимое файла.

что я сделал не так?

редактирование: Я понимаю, что это проблема кодирования, но тогда как я буду конвертировать текст в LPCWSTR, чтобы использовать такие вещи, как WriteConsoleOutputCharacter

Ответы [ 3 ]

7 голосов
/ 12 марта 2011

Современные IDE по умолчанию для приложений Unicode, что означает _TCHAR на самом деле wchar_t.ReadFile() работает с простыми байтами, и если вы используете его для непосредственного заполнения массива _TCHAR, вы получите 8-битные символы, интерпретируемые как Unicode UTF-16.Они обычно отображаются в виде символов CJK (китайский / японский / корейский).

У вас есть три варианта:

  • конвертировать вашу программу в не-Unicode
  • использовать файлсодержащий текст Unicode (в кодировке UTF-16) или
  • , прочитанный из файла в массив символов, а затем используйте MultiByteToWideChar() для преобразования текста в Unicode.

Если вы смешиваете Unicode и не-Unicode, будьте осторожны, чтобы вычислить правильные размеры буфера (количество байтов против количества символов).

Обратите внимание, что вы все еще можете использовать узкие символы с Windows в вашем Unicodeпрограмма, если вы вызываете ANSI-версию функции Windows (например, WriteConsoleOutputCharacterA).

2 голосов
/ 12 марта 2011

Вы неправильно указали тип строки. Текст из файла, который был закодирован в 8-битной кодировке, будет выглядеть как китайский, когда вы смотрите на него через символьный тип, такой как TCHAR с определенным UNICODE, который использует 16-битную кодировку. Исправлено:

 char* text = (char*)malloc(...);

Обычно вам приходится беспокоиться о кодировке, использованной для написания текста. Это может быть, например, utf-8. Вы можете преобразовать 8-битную кодировку в TCHAR (действительно, wchar_t) с помощью MultiByteToWideChar (). Его первый аргумент - тот, о котором надо беспокоиться.

1 голос
/ 12 марта 2011

Вы прочитали текстовый файл ANSI или UTF-8 в строку UTF-16.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...