При попытке создать файл с помощью MSBuild выдается следующее предупреждение:
c: \ repo \ file.cpp (58): предупреждение C4819: файл содержит символ, который не может быть представлен втекущая кодовая страница (0). Сохраните файл в формате Unicode, чтобы предотвратить потерю данных [C: \ repo \ proj.vcxproj]
Перед командой построения я проверяю кодовую страницу (cmd chcp
), которая сообщает мне текущий кодстраница 65001. Установка этого значения не имеет видимого эффекта в команде построения.
Точная ошибка строки (58) выглядит следующим образом:
sprintf(Buffer, "%03d\xb0 %02d' %05.2f\" %s", Splitted.Degree, Splitted.Minutes, Splitted.Seconds, Type.c_str());
Никаких специальных символов, кромеЯ могу видеть. Я переписал строку в режиме вставки, пытаясь удалить возможные символы гремлина, и проанализировал ее в блокноте ++, показывая все символы - ничего! Я также пытался сохранить файл в Unicode (powershell "get-content $file | out-file $file"
), конвертировать utf-8 с и без спецификации из notepad ++ - все еще ничего! И поэтому я смотрю на эту странную вещь номер кодовой страницы. Все, что можно попробовать, приветствуется в комментариях.
Что-то, что может или не может повлиять на это, - это MSBuild (и VS), установленный и работающий в экземпляре Docker (из базовой ОС Windows). Создание такого же исходного кода в обычной среде Windows никогда не сталкивалось с этой проблемой.
Вопрос : Почему MSBuild использует кодовую страницу 0, когда системная кодовая страница является чем-то другим (например, 65001), и как это сделать? Я исправляю это?
Редактировать
Я нашел оскорбительный "персонаж", или, скорее, escape-последовательность: \xb0
. Намерение состоит в том, чтобы напечатать символ степени, найденный в расширенных таблицах ASCII. Изменение b
на 7
заставляет предупреждение исчезнуть. Из того, что я понимаю, это означает, что кодовая страница 0 не поддерживает расширенный диапазон ASCII.
Тем не менее, до сих пор не понимаю, почему сборка использует кодовую страницу 0 вместо системы.