实现定义的行为和将unicode读取到缓冲区

implementation defined behaviour and reading unicode to buffer

本文关键字:unicode 读取 缓冲区 定义 实现      更新时间:2023-10-16

我有两个问题,一个小问题,所以我会一起问。实施定义的行为和未定义的行为一样危险吗?

我使用以下代码从文件中读取了一些unicode字符串:

 char buff[1000];
 while (fgets(buf,1000, ptr_file) != NULL)
        printf("line: %s",buf);

我相信文件中的unicode字符是用UTF8编码保存的。但当我检查时,每个UTF8值都超过了128。然而正如您所看到的,数组是char类型(表示范围-127128(。但是字符串打印正确。发生了什么?我调用UB了吗?

当标准声明某个东西具有实现定义的行为时,这意味着编译器编写器必须记录该东西将发生的事情。该行为是而不是未定义的,但不同实现之间的行为可能有所不同。

CCD_ 2的符号性就是这样一个例子。它是由实现定义的,无论是有符号的还是无符号的,但编译器实现应该记录它(通常,它会提供一个开关,让您选择想要的方式(。

注意,char本身是不同于signed charunsigned char的类型(与signed int同义的int相反(。

交叉引用:C.11:§6.2.5&段落;15和C++。11:§3.9.1&段;1.

为了回答第二个问题,我认为没有任何代码点用UTF-8编码表示的UB,因为参考了C99最新的草案6.2.5,p.3(强调我的(:

声明为类型char的对象足够大,可以存储基本执行字符集。如果是基本执行的成员字符集存储在char对象中,其值保证为是非负的。如果任何其他字符存储在char对象中结果值是实现定义的,但应在可以用该类型表示的值的范围。

这可能有助于添加fgets函数的原型为:

char*fgets(char*restrict s,int n,FILE*restrict stream(;

例如,变音符号ś以UTF-8编码为两个字节:C5(十进制的197,因此假设char的有符号变体,它在-128..127范围之外(和9B。它的实现定义了C5实际上存储在char0对象中。由于UTF-8编码"产生"字节表示,因此在任何单字节范围内存储值都没有实际问题。


第一个问题检查:未定义、未指定和实现定义的行为。