- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
C11 和 C++11 都支持源文件中的扩展字符以及通用字符名称 (UCN),这允许人们仅使用基本源字符集中的字符来输入不在基本源字符集中的字符。
C++11 还定义了编译的几个翻译阶段。特别是,扩展字符在翻译的第一阶段被规范化为 UCN,如下所述:
§ C++11 2.2p1.1:
Physical source file characters are mapped, in an implementation-defined manner, to the basic source character set (introducing new-line characters for end-of-line indicators) if necessary. The set of physical source file characters accepted is implementation-defined. Trigraph sequences (2.4) are replaced by corresponding single-character internal representations. Any source file character not in the basic source character set (2.3) is replaced by the universal-character-name that designates that character. (An implementation may use any internal encoding, so long as an actual extended character encountered in the source file, and the same extended character expressed in the source file as a universal-character-name (i.e., using the \uXXXX notation), are handled equivalently except where this replacement is reverted in a raw string literal.)
因此,我的问题是:
Does a Standard-conforming compilation of the program
#include <stdio.h>
int main(void){
printf("\é\n");
printf("\\u00e9\n");
return 0;
}fail, compile and print
é
éor compile and print
\u00e9
\u00e9, when run?
我认为答案是它成功编译并打印了 \u00e9
,因为根据上面的 §2.2p1.1,我们有
实现可以使用任何内部编码,只要在源文件中遇到实际的扩展字符,并且在源文件中将相同的扩展字符表示为通用字符-character-name(即,使用\uXXXX 表示法),被等效地处理,除非此替换在原始字符串文字中恢复。,而且我们不在原始字符串文字中。
接下来是
printf("\é\n");
映射到 printf("\\u00e9\n");
。"\\u00e9\n"
是一个。\\
映射到 \
,片段 u00e9
不被识别为 UCN,因此按原样打印.不幸的是,现存的编译器不同意我的观点。我已经使用 GCC 4.8.2 和 Clang 3.5 进行了测试,这是他们给我的:
海湾合作委员会 4.8.2
$ g++ -std=c++11 -Wall -Wextra ucn.cpp -o ucn
ucn.cpp: In function 'int main()':
ucn.cpp:4:9: warning: unknown escape sequence: '\303' [enabled by default]
printf("\é\n");
^
$ ./ucn
é
\u00e9
clang 3.5
$ clang++ -std=c++11 -Wall -Wextra ucn.cpp -o ucn
ucn.cpp:4:10: warning: unknown escape sequence '\xFFFFFFC3' [-Wunknown-escape-sequence]
printf("\é\n");
^
ucn.cpp:4:12: warning: illegal character encoding in string literal [-Winvalid-source-encoding]
printf("\é\n");
^
2 warnings generated.
$ ./ucn
é
\u00e9
我使用 hexdump -C ucn.cpp
对 é
字符显示为 C3 A9
进行了双重和三次检查,一致使用预期的 UTF-8 编码。我还验证了普通的 printf("é\n");
或 printf("\u00e9\n");
可以完美地工作,所以这不是测试的编译器无法读取 UTF-8 源文件的问题。
谁是对的?
最佳答案
'é' 不是字符串文字中反斜杠转义的有效字符,因此反斜杠后跟 'é' 作为文字源字符或 UCN 应该会产生编译器诊断和未定义的行为。
但是请注意,"\\u00e9"
不是以反斜杠开头的 UCN,并且不可能在字符串或字 rune 字中写入任何基本源字符序列一个反斜杠后跟一个 UCN。因此 "\é"
和 "\\u00e9"
不需要表现相同: "\\u00e9"
的行为可以是完美定义,而 "\é"
的行为未定义。
如果我们假设一些允许反斜杠转义 UCN 的语法,比如说 "\«\u00e9»"
,那么这将具有未定义的行为,如 "\é"
.
- In Phase 1,
printf("\é\n");
maps toprintf("\\u00e9\n");
.
é
到 UCN 的第一阶段转换不能创建非 UCN,例如 "\\u00e9"
。
编译器是对的,但并没有专门用完美的诊断消息来处理这种情况。理想情况下,您会得到:
$ clang++ -std=c++11 -Wall -Wextra ucn.cpp -o ucn
ucn.cpp:4:10: warning: unknown escape sequence '\é' [-Wunknown-escape-sequence]
printf("\é\n");
^
1 warnings generated.
$ ./ucn
é
\u00e9
两个编译器都指定它们在存在未知转义序列时的行为是用转义后的字符替换转义序列,因此 "\é"
将被视为 "é "
整个程序应该解释为:
#include <stdio.h>
int main(void){
printf("é\n");
printf("\\u00e9\n");
return 0;
}
两个编译器确实碰巧得到这种行为,部分是偶然的,但也部分是因为按照他们的方式处理无法识别的转义序列的策略是一个明智的选择:即使他们只看到无法识别的转义序列作为反斜杠后跟字节 0xC3,他们删除反斜杠并将 0xC3 保留在原位,这意味着 UTF-8 序列保持不变以供以后处理。
关于c++ - C11 & C++11 扩展和通用字符转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153902/
我是 magento 的新手,目前我在 magento 安装期间遇到“必须加载 PHP 扩展 curl ”错误。你能帮帮我吗? 最佳答案 如果您的服务器上没有安装 curl,您可以键入以下命令之一来安
我在 macOS Mojave/macOS Big Sur/macOS Monterey/macOS Ventura 上使用最新的 php 版本 7.2 并收到类似错误 $composer requ
这个问题已经有答案了: Why generic type is not applicable for argument extends super class for both? (5 个回答) 已关
我正在使用 NightWatch.js 并进行一些 UI 测试,我想用一些额外的 desiredCapabilities 启动默认浏览器实例(即启用扩展并应用一些特定值)。 p> 注意:我可以执行这些
有人知道为什么我在 java 8 中使用此代码时没有服务器扩展名称吗: try { URL url = new URL(urlString); URLC
扩展提供给我的类(class)。为现有的类提供新功能。或扩展现有的mixin s 或虚拟类,任何东西都可以工作。 也许是这样的: class FlatButton {} // maybe no
我有一个关于使用 c 代码和 mod_wsgi 扩展 python 的问题。 我在 apache 服务器中有一个 django 应用程序,它查询 postgresql 数据库以生成报告。在某些报告中,
testcafe支持在Chrome浏览器中加载crx扩展吗? 如果是这样,请告诉我需要尝试什么方法。 我尝试了下面的代码,但没有成功 await t.eval(new Function(fs.read
这个问题已经有答案了: What is a raw type and why shouldn't we use it? (16 个回答) 已关闭 3 年前。 有什么区别: // 1 class A c
我正在编写一个 chrome 扩展来记录单击开始按钮后触发的请求。 这是我的文件:1. list .json { "manifest_version": 2, "name": "recorde
我每天都在使用 vim 和 perforce 现在我的问题是,如果我想查看 perforce 文件修订版,则从命令模式下的 vim :!p4 打印文件#1 vim 试图让我获得缓冲区 #1。有没有办法
大家好,我有一个关于 NUnit 扩展(2.5.10)的问题。 我想做的是向 数据库。为此,我使用 Event 创建了 NUnit 扩展 听众。 我遇到的问题是公共(public)无效 TestFin
我有弹出窗口,而不是模态窗口。 如何通过单击页面的其他部分(不在窗口中)来关闭此窗口? 最佳答案 像这样的东西: function closeWin(e, t) { var el = win.
我通常非常谨慎地使用扩展方法。当我确实觉得有必要编写一个扩展方法时,有时我想重载该方法。我的问题是,您对调用其他扩展方法的扩展方法有何看法?不好的做法?感觉不对,但我无法真正定义原因。 例如,第二个
扩展 Ant Ant带有一组预定义的任务,但是你可以创建自己的任务,如下面的例子所示。 定制Ant 任务应扩展 org.apache.tools.ant.Task 类,同时也应该拓展 execut
我想要一个重定向所有请求的扩展: http://website.com/foo.js 到: http://localhost/myfoo.js 我无法使用主机文件将主机从 website.com 编辑
对于为什么 QChartView 放在 QTabWidget 中时会扩展,我有点迷惑。 这是 QChartView 未展开(因为它被隐藏)时应用程序的图片。 应用程序的黑色部分是 QOpenGLWid
如果在连接条件中使用 OR 运算符,如何优化以下查询以避免 SQL 调优方面的 OR 扩展? SELECT t1.A, t2.B, t1.C, t1.D, t2.E FROM t1 LEFT J
一旦加载插件的问题得到解决(在 .NET 中通过 MEF 的情况下),下一步要解决的是与它们的通信。简单的方法是实现一个接口(interface),使用插件实现,但有时插件只需要扩展应用程序的工作方式
在我的 Symfony2 包中,我需要检查是否定义了一个函数(一个扩展)。更具体地说,如果安装了 KnpMenuBundle,我会在我的包中使用那个,否则我将自己渲染插件。 我试过了,但这当然不起作用
我是一名优秀的程序员,十分优秀!