首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++源代码中使用Unicode

问在C++源代码中使用Unicode
EN

Stack Overflow用户
提问于 2008-12-01 18:09:45
回答 8查看 44.6K关注 0票数 61

C++源代码的标准编码是什么?C++标准对此有什么规定吗?我能用Unicode写C++源码吗?

例如,我是否可以在注释中使用非ASCII字符,如中文字符?如果是这样,是允许完整的Unicode,还是只允许Unicode的子集?(例如,16位的第一页或其他名称。)

此外,我可以使用Unicode作为字符串吗?例如:

代码语言:javascript
复制
Wstring str=L"Strange chars: â Țđ ě €€";
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-12-01 19:38:43

在C++中编码相当复杂。这是我对它的理解。

每个实现都必须支持来自基本源字符集的字符。这些字符包括§2.2/1 (C++11中的§2.3/1)中列出的常见字符。这些字符应该全部放在一个char中。此外,实现必须支持一种使用名为universal-character-names的方式命名其他字符的方法,看起来像\uffff或\Uffffffff,并且可以用来引用Unicode字符。它们中的一个子集可用于标识符(在附件E中列出)。

这很好,但是从文件中的字符到源字符(在编译时使用)的映射是由实现定义的。这构成了所使用的编码。这是它的字面意思(C++98版本):

如有必要,

物理源文件字符将以实现定义的方式映射到基本源字符集(引入换行符作为行尾指示符)。三重图序列(2.3)被相应的单字符内部表示所取代。不在基本源字符集(2.2)中的任何源文件字符都被表示该字符的通用字符名称所取代。(实现可以使用任何内部编码,只要对源文件中遇到的实际扩展字符和源文件中表示为通用字符名称的相同扩展字符(即使用\uXXXX表示法)进行等效处理即可。)

对于gcc,您可以使用选项-finput-charset=charset进行更改。此外,您还可以更改用于在运行时重新设置值的执行字符。对于char,合适的选项是-fexec-charset=charset (默认为utf-8)和-fwide-exec-charset=charset (默认为utf-16或utf-32,具体取决于wchar_t的大小)。

票数 37
EN

Stack Overflow用户

发布于 2008-12-01 18:26:21

据我所知,C++标准没有提到任何关于源代码文件编码的内容。

通常的编码是(或曾经是)7位ASCII --一些编译器(例如Borland的)在使用高位的ASCII字符时会犹豫不决。如果您的编译器和编辑器接受Unicode字符,那么不能使用Unicode字符没有技术上的原因--大多数基于Linux的现代工具和许多更好的基于Windows的编辑器处理UTF-8编码都没有问题,尽管我不确定Microsoft的编译器是否可以。

编辑:看起来微软的编译器将接受Unicode编码的文件,但有时也会在8位ASCII上产生错误:

代码语言:javascript
复制
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.
票数 11
EN

Stack Overflow用户

发布于 2008-12-03 15:03:03

除了litb的post,MSVC++也支持Unicode。我知道它是从BOM中获取Unicode编码的。如果你真的喜欢代码混淆,它绝对支持像int (*♫)();或const std::set<int> ∅;这样的代码:

代码语言:javascript
复制
typedef void ‼; // Also known as \u203C
class ooɟ {
    operator ‼() {}
};
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/331690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档