C++源代码的标准编码是什么?C++标准是否甚至对此有所说明?我可以用Unicode编写C++源代码吗?
例如,我可以在评论中使用非ASCII字符,例如中文字符吗?如果是这样,是允许完全Unicode还是只是Unicode的一个子集?(例如,那个16位的第一页或者它被称为的任何东西.)
此外,我可以使用Unicode作为字符串吗?例如:
Wstring str=L"Strange chars: â ?š? ? €€";
Johannes Sch.. 35
使用C++进行编码非常复杂.这是我对它的理解.
每个实现都必须支持基本源字符集中的字符.这些包括§2.2/ 1中列出的常见字符(C++ 11中的§2.3/ 1).这些字符都应该合而为一char
.此外,实现必须支持使用调用的方式命名其他字符的方法,universal-character-names
并且看起来像\uffff
或\Uffffffff
可以用于引用Unicode字符.它们的一个子集可用于标识符(在附录E中列出).
这很好,但是从文件中的字符到源字符(在编译时使用)的映射是实现定义的.这构成了所使用的编码.这是字面意思(C++ 98版):
如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).Trigraph序列(2.3)由相应的单字符内部表示代替.不在基本源字符集(2.2)中的任何源文件字符将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即使用\ uXXXX表示法),等效).
对于gcc,您可以使用该选项进行更改-finput-charset=charset
.此外,您可以在运行时更改用于表示值的执行字符.适当的选项是-fexec-charset=charset
char(默认为utf-8
)和-fwide-exec-charset=charset
(默认为utf-16
或者utf-32
取决于大小wchar_t
).
使用C++进行编码非常复杂.这是我对它的理解.
每个实现都必须支持基本源字符集中的字符.这些包括§2.2/ 1中列出的常见字符(C++ 11中的§2.3/ 1).这些字符都应该合而为一char
.此外,实现必须支持使用调用的方式命名其他字符的方法,universal-character-names
并且看起来像\uffff
或\Uffffffff
可以用于引用Unicode字符.它们的一个子集可用于标识符(在附录E中列出).
这很好,但是从文件中的字符到源字符(在编译时使用)的映射是实现定义的.这构成了所使用的编码.这是字面意思(C++ 98版):
如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).Trigraph序列(2.3)由相应的单字符内部表示代替.不在基本源字符集(2.2)中的任何源文件字符将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即使用\ uXXXX表示法),等效).
对于gcc,您可以使用该选项进行更改-finput-charset=charset
.此外,您可以在运行时更改用于表示值的执行字符.适当的选项是-fexec-charset=charset
char(默认为utf-8
)和-fwide-exec-charset=charset
(默认为utf-16
或者utf-32
取决于大小wchar_t
).
据我所知,C++标准没有提及源代码文件编码的任何内容.
通常的编码是(或曾经是)7位ASCII - 一些编译器(例如Borland的编码器)会忽略使用高位的ASCII字符.如果您的编译器和编辑器接受它们,那么没有技术上的原因无法使用Unicode字符 - 大多数现代的基于Linux的工具,以及许多基于Windows的更好的编辑器,可以毫无问题地处理UTF-8编码,尽管我我不确定微软的编译器会不会.
编辑:看起来微软的编译器会接受Unicode编码的文件,但有时也会产生8位ASCII的错误:
warning C4819: The file contains a character that cannot be represented in the current code page (932). Save the file in Unicode format to prevent data loss.
除了litb的帖子,MSVC++也支持Unicode.据我所知,它从BOM中获取Unicode编码.它肯定支持代码int (*?)();
或const std::set
如果你真的进入代码obfuscuation:
typedef void ?; // Also known as \u203C class oo? { operator ?() {} };
这里有两个问题.第一个是C++代码(和注释)中允许的字符,例如变量名.第二个是字符串和字符串文字中允许的字符.
如上所述,C++编译器必须支持一个非常受限制的基于ASCII的字符集,用于代码和注释中允许的字符.在实践中,这个字符集对于一些欧洲字符集(特别是一些没有几个字符的欧洲键盘 - 如方括号 - 可用)效果不佳,因此有向图和三字符的概念是介绍.许多编译器目前接受的不仅仅是这个字符集,但没有任何保证.
至于字符串和字符串文字,C++具有宽字符和宽字符串的概念.但是,该字符集的编码未定义.在实践中它几乎总是Unicode,但我认为这里没有任何保证.宽字符串文字看起来像L"字符串文字",这些可以分配给std :: wstring.
C++ 11增加了对Unicode字符串和字符串文字的明确支持,编码为UTF-8,UTF-16大端,UTF-16小端,UTF-32大端和UTF-32小端.