当前位置:  开发笔记 > 编程语言 > 正文

在C++源代码中使用Unicode

如何解决《在C++源代码中使用Unicode》经验,为你挑选了4个好方法。

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=charsetchar(默认为utf-8)和-fwide-exec-charset=charset(默认为utf-16或者utf-32取决于大小wchar_t).



1> Johannes Sch..:

使用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=charsetchar(默认为utf-8)和-fwide-exec-charset=charset(默认为utf-16或者utf-32取决于大小wchar_t).



2> Head Geek..:

据我所知,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.



3> MSalters..:

除了litb的帖子,MSVC++也支持Unicode.据我所知,它从BOM中获取Unicode编码.它肯定支持代码int (*?)();const std::set ?; 如果你真的进入代码obfuscuation:

typedef void ?; // Also known as \u203C
class oo? {
    operator ?() {}
};



4> Max Lybbert..:

这里有两个问题.第一个是C++代码(和注释)中允许的字符,例如变量名.第二个是字符串和字符串文字中允许的字符.

如上所述,C++编译器必须支持一个非常受限制的基于ASCII的字符集,用于代码和注释中允许的字符.在实践中,这个字符集对于一些欧洲字符集(特别是一些没有几个字符的欧洲键盘 - 如方括号 - 可用)效果不佳,因此有向图和三字符的概念是介绍.许多编译器目前接受的不仅仅是这个字符集,但没有任何保证.

至于字符串和字符串文字,C++具有宽字符和宽字符串的概念.但是,该字符集的编码未定义.在实践中它几乎总是Unicode,但我认为这里没有任何保证.宽字符串文字看起来像L"字符串文字",这些可以分配给std :: wstring.


C++ 11增加了对Unicode字符串和字符串文字的明确支持,编码为UTF-8,UTF-16大端,UTF-16小端,UTF-32大端和UTF-32小端.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有