包含不能在代码页(936)中显示的字符,请保存为unicode格式

该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

警告 10 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 c:\program files\nvidia gpu computing toolkit\cuda\v5.0\include[u]device_functions.h[/u] 1

警告 12 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 c:\program files\nvidia gpu computing toolkit\cuda\v5.0\include\device_functions.h 1662

警告 1 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 c:\program files\nvidia gpu computing toolkit\cuda\v5.0\include\math_functions.h 1

警告 206 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 c:\program files\nvidia gpu computing toolkit\cuda\v5.0\include\sm_13_double_functions.h 1

怎么办,好几个头文件都有这种警告,虽然不影响使用,但是看着很不爽,以前cuda 4.2の时候没有的。

CP936是我们国_家的字符编码标准,即我们常说的GB2313, GBK, GB1830这些。

Unicode是一个试图包含所有民族语言的统一编码,我们的一个华人同胞,在当年Windows NT 3.1采用unicode的决定中,发挥了巨大作用。

回到楼主的现象,因为其他的一些代码页中包含的内容(例如那美克星语),在我们的CP936中,没有对应的编码,以及您的当前windows所使用的为非unicode编码的默认代码页是CP936. 导致此字符无法以当前格式继续保存。

因为vs把.h之类的文件当作文本来处理,而纯文本格式在使用ASCII以及普通的GB编码的使用,无法标记此文件是属于何种编码类型的,所以VS根据历史原因,认为它是ASCII或者当前的编码(GB编码是ASCII的超集),所以如果当有些字符无法用当前编码保存的话,会如此提醒你。

此外,因为UTF之类的保存的时候,可以在文本文件头部放入标记(因为这是后来大家都同意如此干,有了标准了,所以可以如此处理)。所以建议改成unicode(unicode含有的编码数目更多), 因为(1)标记了文件为unicde (2)可以容易保存更多种的字符,所以这样可能不会丢失。

此外,在我的机器上,这些.h中(例如device_functions.h),不含有无法在CP936中(ASCII的超集)不能保存的字符,所以对于在贵机上出现如此现象,我表示奇怪。请问你是否修改过这些文件?如果没有,那就是NV的问题,NV应当提供一个只包含ASCII字符的版本。

NV习惯经常更新版本,只要大的版本号不变,不会额外提醒你,即,你间隔一段日子两次下载的CUDA 5.0, 可能实际上不同的修正版,但他们都叫5.0。

所以我的5.0的这些文件里无此问题不代表你的文件里没有,你可以通过:
(1)返回上一个小版本(如果还有保留安装程序),看看是否无此问题,以确定此问题是否NV新引入的。
(2)重新安装当前版本。看看问题是否解决。如果解决。那么可能是你不小心修改了文件,才导致这些问题,而不是NV的问题。
(3)下载下一个版本,如果你已经安装5.0一段日子了,那么下一个小版本可能已经出现(依然叫5.0), 你可以下载这个版本看看是否还有问题。如果(2)能重现问题,而(3)中不出现,那么此问题已经被别人发现,报告,并被NV修正了。

大致如此。我的头文件没有问题的CUDA 5 toolkit的版本号是:release 5.0, V0.2.1221
供您参考。

我替楼主进行了重复试验,在我重新下载并更新到最新版后,发现问题出现,和楼主的想象一样。

这些头文件里的确多了一些非ASCII字符,在一些注释部分,例如device_functions.h的注释中,出现了多个编码>127的字符。而我们用的代码页(例如CP936), 包含的ASCII子集是<=127的部分,所以导致了如上提示。

所以责任在NV,他们发行的头文件里,使用了一些非标准ASCII字符(例如注释)

这个问题的引入是试图使用自动化文档生成的时候产生的,没有考虑到VS在遇到无BOM头文件,作为ANSI编码读取时,使用的代码页和制作,插入注释时候的代码页不同导致的。

更改建议:建议NV立刻以UTF-8保存,或者建议不使用编码>127的字符。并发布更正新版。

我尝试使用pragma warning来禁用,代码如下:
#pragma warning(disable: C4819)
另外我又尝试了:
#pragma warning(disable: 4819)

都无法禁用这个警告,怎么办?

楼主您好!如何让您的VC的编译器不再抱怨4819号警告超出了我的能力范围。

建议您咨询Must, ICE, 田园08, yyfn风辰等版主,或者咨询其他会员朋友。

我今天也遇到此问题,在网上找了个解决该问题的帖子blog.csdn.net/hevc_cjl/article/details/8426882(本人没有发网址权限,前面要加h_t_t_p:)
在操作前建议将有警告的文件备份下

据说最新版已经修正,当然,6#给出的重新保存所有文件也是不错的选择。:slight_smile:

:),那我下载5.0最新版去

我直接下载旧版的5.0.27,世界清净了