gcc编译器负责存储(在可执行文件中)来自C语言char数组的utf8字符吗?

问题描述 投票:0回答:1

我在 Ubuntu 系统上编写了这个简单的程序:

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>


int main( void ){

    char utf8_arr[] = "写一个名字列表: \n\n";
    
    write(1,utf8_arr,sizeof(utf8_arr));
    
    
    char utf8_buff[1024];
    ssize_t r;
    
    while ( (r = read(0,utf8_buff,sizeof(utf8_buff))) > 0 ){
    
             
             write(1,utf8_buff,r); 
             
    }
    
     return 0;

}

我的问题:

1)当涉及到像我的程序中那样的 C 语言字符串时,谁控制字符编码(实际字符在内存中存储的方式)?是 gcc 编译器吗(它又从某处获取自己的字符编码设置)?

2)像我的程序那样使用 utf8 字符串来存储、写入和读取是否 100% 正确?

3) sizeof 怎么样?这样用可以吗

c gcc terminal utf-8 character-encoding
1个回答
0
投票

1)谁控制字符编码(实际字符的方式) 存储在内存中)当涉及到 C 语言字符串时,例如 我的程序?是 gcc 编译器吗(反过来又拥有自己的 来自某处的字符编码设置)?

C 语言规范规定有两个相关的“字符集”,实际上它们都是一组抽象字符及其成员编码的混合体。存在源字符集和执行字符集,其中后者的成员在源代码中由前者的成员或转义序列表示。这种区别主要是关于编码方面,而不是所涵盖的抽象字符的身份。

C 指定必须是这些集合的成员的字符集合,并且必须通过大小为

char
的单个代码单元在每个字符中表示(原则上可能会有所不同,但实际上几乎总是 8 位)。 C 允许由 C 实现自行决定使用其他字符,并允许其中一些字符可以具有多字节表示形式。

C 源代码中字符的表示方式就是“源字符集”。它们在运行时呈现给执行环境的方式是“执行字符集”。我不确定 C 实际上将其中之一指定为“内存中”表示形式,但执行字符集是唯一实用的选择。

谁控制?

使用/支持哪些字符集由 C 实现自行决定,例如 GCC + Glibc 或 GCC + musl 或 MSVC + MSCRT。没有具体说明谁实际控制,但由实施决定谁控制。在基于 GCC 的系统中,GCC 定义了默认值,并且可以在基于系统的 iconv 库的限制内通过命令行选项覆盖这些默认值。最终,

用户
控制。

2)仅使用 utf8 字符串来存储、写入是否 100% 正确 并按照我的程序的方式阅读?

不。 C 不要求使用或接受任何特定的源字符集,并且它没有定义必须使用什么执行字符集。无法保证所有 C 实现都会按照您想要的方式解释您的源代码,甚至 GCC 在所有情况下都会按照您想要的方式解释它。

假设您可以依赖 C11 或更高版本,则可以使用 UTF-8 文字来寻址内存中表示,这些文字具有

char

类型的元素,并在带有

u8
前缀的源代码中表示:
    char utf8_arr[] = u8"写一个名字列表: \n\n";

您仍然受到 
source

字符集注意事项的影响,但您可以依靠 UTF-8 进行内存中表示。

3) sizeof 怎么样?这样用可以吗

这取决于您期望它做什么,但示例使用对我来说看起来不错。特别是,您可以依靠
sizeof utf8_arr

来正确生成

utf8_arr
占用的字节数,无论相关执行字符集要求为所提供的初始值设定项提供什么。
    

© www.soinside.com 2019 - 2024. All rights reserved.