实现定义的行为和将unicode读取到缓冲区
implementation defined behaviour and reading unicode to buffer
我有两个问题,一个小问题,所以我会一起问。实施定义的行为和未定义的行为一样危险吗?
我使用以下代码从文件中读取了一些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 char
和unsigned 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
实际上存储在char
0对象中。由于UTF-8编码"产生"字节表示,因此在任何单字节范围内存储值都没有实际问题。
第一个问题检查:未定义、未指定和实现定义的行为。
- 如何从 oracle 数据库 c++ 读取 unicode
- 在 Windows 中使用 boost::p rogram_options 从命令行参数读取 Unicode 字符
- 在C++中读取 unicode 输入时出现问题
- C++如何通过忽略每行的第一个字符来读取 unicode 文件
- 一次读取一个字节的 unicode
- SQLGetPrivateProfileString 错误地读取 Unicode 字符
- 是否可以使用 cv::waitkey(0) 读取 unicode 值
- 读取 CSV 文件(UNICODE 编码)C++时出现编码错误
- 如何从Windows中的进程中读取Unicode字符串
- 无法读取使用Unicode的文件(存在)
- 从包含Unicode字符的文件中读取
- 读取/写入unicode c++
- 为什么getline正在读取我的整个unicode文件
- 这是怎麽?在读取使用 Unicode 编码的文本文件后控制台输出的开头
- 使用 Unicode 编码从 txt 文件读取 -- C++/C#
- 如何读取具有Unicode代码的文本文件
- 使用std::wifstream读取带有特殊字符的unicode文件
- 正在用C++从文件中读取Unicode字符
- 读取Unicode UTF-32文件到wstring
- 实现定义的行为和将unicode读取到缓冲区