0

尝试使用 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());

据我所知,没有特殊字符。我已经在插入模式下重写了该行,试图清除可能的 gremlin 字符,并在 notepad++ 中对其进行分析,显示所有符号 - 没有!我还尝试将文件保存为 unicode ( powershell "get-content $file | out-file $file"),从 notepad++ 转换带有和不带有 BOM 的 utf-8 - 仍然没有!因此,我正在研究这个代码页码奇怪的东西。在评论中欢迎任何其他尝试。

可能会或可能不会影响这一点的东西是在 Docker 实例(来自 Windows 基本操作系统)中安装和运行的 MSBuild(和 VS)。在常规 Windows 环境中构建相同的源从未遇到过这个问题。

问题:当系统代码页是其他内容(例如 65001)时,为什么 MSBuild 会使用代码页 0,我该如何解决?


编辑

我发现了有问题的“字符”,或者更确切地说是转义序列:\xb0. 目的是打印扩展 ASCII 表中的度数符号。更改b7使警告消失。据我了解,这意味着代码页 0 不支持扩展的 ascii 范围。

仍然不明白为什么构建使用代码页 0 而不是系统。

4

0 回答 0