我试图弄明白为什么一个8位的字符串文字可以包含多字节字符,而一个字符向量不能?

Let me better explain:
We can do this:

char chars[] = "????????????????必西♠♬♭♮♯"; // the compiler adds '\0'
// sizeof(chars) is 38 bytes

但我们不能这样做:

char chars[] = { '????', '????', '????', '????', '必', '西', '♠', '♬', '♭', '♮', '♯', '\0'};

// error: narrowing conversion of ‘-257972808’ from ‘int’ to ‘char’ [-Wnarrowing]

我们必须这样做:

wchar_t chars[] = { '????', '????', '????', '????', '必', '西', '♠', '♬', '♭', '♮', '♯', '\0'};
  
// sizeof(chars) is 48 bytes
// no errors

字符串文字符号不是字符向量的简单快捷方式吗?

推荐答案

8位char最多只能保存256个值,但Unicode有数十万个字符.很明显,它们无法容纳一个char人.所以,它们必须是encoded,这样才能适应multiplechar.

您的编辑器/编译器可能正在以UTF-8编码存储示例字符串.UTF-8中的非ASCII字符占用的空间超过1char个.

在您的示例中,在UTF-8中,sizeof(chars)的大小为55+1=56 chars(+1表示空终止符),即使您只看到29个"字符"(如果计算空格),其中:

= 0x20 (18x)
???? = 0xF0 0x9F 0x98 0x8E
???? = 0xF0 0x9F 0xA5 0xB8
???? = 0xF0 0x9F 0xA4 0xA9
???? = 0xF0 0x9F 0xA5 0xB3
= 0xE5 0xBF 0x85
西 = 0xE8 0xA5 0xBF
= 0xE2 0x99 0xA0
= 0xE2 0x99 0xAC
= 0xE2 0x99 0xAD
= 0xE2 0x99 0xAE
= 0xE2 0x99 0xAF

Linux相关问答推荐

awk:try 将时间戳字符串转换为unix纪元时间

空字符串和空文件的区别

通过ssh传输参数时避免字符串拆分

如何将数据从Linux内核中的块驱动程序持久存储到存储中?

如何将参数传递给Bash函数

用于替换 struct 文档中文本的 Bash 脚本

为什么我的 Docker 进程不断在我的 Raspberry Pi 上重新启动?

当未在日志(log)中输入确切的时间戳时如何过滤日期范围内的值

BASEDIR 环境变量未正确定义

nvm:无法卸载当前活动的 node 版本

pthread_exit 与返回

如何让 GNU 屏幕读取 .bash_profile/.bash_rc 更改?

zsh/bash 上不区分大小写的 Glob

如何搜索文件并将它们压缩到一个 zip 文件中

`是什么意思! -d` 在这个 Bash 命令中?

从核心转储中获取堆栈跟踪

如何知道linux调度器时间片?

bash中变量名后的2个逗号是什么意思?

在不运行测试的情况下制作(从源代码安装)python

如何限制堆大小?