Проблема связана с содержимым файла. Предполагая, что это файл, созданный вашим связанным вопросом, вы можете просмотреть его содержимое в шестнадцатеричном редакторе, чтобы узнать следующие факты:
- Его содержимое закодировано в UTF-16 (LE) без спецификации
- Его новые строки кодируются как CR или CR CR вместо CR LF
Я думал, что новые строки будут важнее, чем кодировка текста, но, оказывается, у меня это было задом наперед. Если я изменяю каждую из этих вещей независимо, GetLine, кажется, работает правильно для CR, CR CR или CR LF, но обрабатывает UTF-16 только при наличии спецификации. (То есть в шестнадцатеричном редакторе файл начинается с FF FE 57 00 вместо 57 00 для файла, начинающегося с символа W.)
Я немного растерялся из-за лучшего способа решения этой проблемы. Если вы готовы принять вызов, вы можете прочитать файл с помощью FILE_MODE_BINARYREADONLY и использовать свои дополнительные знания о том, что должно быть в файле, чтобы убедиться, что вы правильно интерпретируете его кодировку. Обратите внимание, что для большей части UTF-16 вы можете создать одну единицу кода, комбинируя два байта следующим образом:
szResult[i] = (nHigh << 8) + nLow;
, где nHigh
и nLow
, вероятно, являются значениями, такими как szBuffer[2*i + 1]
и szBuffer[2*i]
, при условии, что вы заполнили STRING szBuffer, вызвав ReadBytes.
Другие непроверенные идеи включают редактирование в двоичном виде для обеспечения наличия спецификации (FF FE), выяснение способов обеспечения первоначального создания файла с помощью спецификации, выяснение способов его создания в альтернативной кодировке, поиск другой команды Вы можете вызвать «исправить» файл или отправить запрос поставщику (моему работодателю) и надеяться, что команда разработчиков изменит что-то, чтобы лучше справиться с этим делом.
Вот более простое решение. Если вы можете с уверенностью предположить, что команда будет добавлять символы UTF-16 без подписи, вы можете добавить эти выходные данные в файл, который имеет только подпись. Как вы получаете такой файл?
- Вы можете создать файл с только спецификацией в вашей среде разработки и добавить его в файлы поддержки. Если вам нужно использовать его несколько раз, сначала скопируйте его.
Вы можете создать его с помощью кода. Просто позвоните по следующему (проверка ошибок не включена для ясности)
OpenFileMode(FILE_MODE_APPEND_UNICODE);
CreateFile(nFileHandle, szDir, szFileName);
CloseFile(nFileHandle);
и если szDir ^ szFileName не существует, теперь это будет файл только с подписью UTF-16.
Предполагая, что этот файл называется sig.txt
, вы можете затем вызвать команду
wslconfig /l <strong>>> sig.txt</strong>
для записи в этот файл. Обратите внимание на удвоенный >>
для добавления. Полученный файл будет включать подпись Unicode, которую вы создали заранее, плюс вывод данных Unicode из wslconfig, и GetLine должен правильно интерпретировать вещи.
Самая большая проблема здесь в том, что это жестко закодировано вокруг поведения wslconfig, и это поведение может измениться в любой момент. Вот почему Кристофер ссылается на рекомендацию API, и я полностью согласен. В то же время, вы можете попытаться сделать это более надежным, вызвав его в cmd /U
(но мое понимание того, что это делает или гарантирует, в лучшем случае нечетко), или попробовав оригинальный способ, а затем с помощью спецификации.