C++23:char 现在支持 Unicode?

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

C++23 现在是否在其基本

char
类型中提供对 Unicode 字符的支持,支持到什么程度?


所以字符文字的cppreference,字符文字:

'c-char'

定义为:

  • a
    basic-c-char
  • 转义序列,如转义序列中所定义
  • 通用字符名称,如转义序列中定义

然后对于

basic-c-char
,它的定义是:

基本源字符集(C++23 之前)翻译字符集(C++23 起)中的字符,单引号

'
、反斜杠
\
或换行符除外

cppreference 的字符集页面,它定义了“翻译字符集”,由以下内容组成:

  • 每个抽象字符在 Unicode 代码空间中分配一个代码点,并且(C++23 起)
  • 每个 Unicode 标量值的不同字符未分配给抽象字符。

并指出:

翻译字符集是基本字符集和基本文字字符集的超集(见下文)。

在我看来,“基本字符集”(在上一页给出)基本上是 ASCII 的子集。我也一直认为

char
就是 ASCII(支持 ISO-8859 字符集,例如每个 Microsoft 关于字符类型的页面)。但现在随着
basic-c-char
翻译字符集的改变,似乎它在某种程度上支持了Unicode。

我知道实际的编码是实现定义的(除了空字符和递增的十进制数字字符之外)。但我的主要问题是这个“翻译字符集”真正支持哪些字符?都是Unicode吗?我觉得我读到的内容比实际情况要多。

c++ unicode character-encoding char literals
1个回答
0
投票

这个“翻译字符集”真正支持哪些字符?

正如您已经引用的那样(我将引用最新的 C++ 标准草案):

[lex.charset]

翻译字符集由以下元素组成:

  • 每个抽象字符在 Unicode 代码空间中分配一个代码点,并且
  • 每个 Unicode 标量值的不同字符未分配给抽象字符。

让我们查找规则中使用的术语的定义(引自 Unicode 14):

第一点:

字符和编码

抽象特征:用于组织的信息单位, 控制,或文本数据的表示。

  • 在表示数据时,该数据的性质通常是象征性的,而不是其他类型的数据(例如,听觉或 视觉的)。此类符号数据的示例包括字母、表意文字、 数字、标点符号、技术符号和标志。
  • 抽象字符没有具体形式,不应与字形混淆。
  • 抽象字符不一定对应于用户所认为的“字符”,并且不应与字素混淆。
  • 由 Unicode 标准编码的抽象字符称为 Unicode 抽象字符。
  • 不直接由 Unicode 标准编码的抽象字符通常可以通过使用组合字符序列来表示

第二点:

Unicode 编码形式

Unicode 标量值:除高代理和低代理代码点之外的任何 Unicode 代码点。

  • 作为此定义的结果,Unicode 标量值集由 范围为 0 至 D7FF 16 和 E000 16 至 10FFFF 16(含)。

C++ 标准也有一个澄清说明:

[注1: Unicode 代码点是 [0, 10FFFF] 范围内的整数 (十六进制)。代理代码点是 [D800, DFFF](十六进制)。 Unicode 标量值是任何代码点 不是代理代码点。 — 尾注]


都是Unicode吗?

TLDR:不。例如。代理代码点和组合字符序列不在翻译字符集中。


附注C++ 标准从未禁止

char
文字中的 Unicode;此更改只是强制要求 Unicode 支持。

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