char对象与哪个字符编码(Unicode版本)集相对应?
什么的Unicode 一个确实char
对象对应于:
(我知道实际上没有
char
类型,但是我假设该String
类型仍然实现为Unicode字符数组)
通常,在编程语言之间是否存在使用特定 的通用约定 ?
回答:
- 我试图澄清我的问题。我所做的更改将在下面的评论中讨论。
- 回复:“您要解决什么问题?” ,我对从独立于语言的表达式生成代码感兴趣,并且文件的特定编码是相关的。
回答:
我不确定我是否在回答您的问题,但请允许我发表一些意见,希望能有所启发。
在核心上,像我们正在谈论的通用编程语言(C,C
++,C#,Java,PHP)没有“文本”的概念,而仅仅是“数据”的概念。数据由整数值(即数字)序列组成。这些数字背后没有内在的 含义 。
将数字流转换为文本的过程是语义之一,通常留给消费者将相关的语义分配给数据流。
警告:
我现在将使用“编码”一词,不幸的是它具有多种不等同的含义。“编码”的第一个含义是将含义分配给数字。数字的语义解释也称为“字符”。例如,在ASCII编码中,32表示“空格”,65表示“大写A”。ASCII仅将含义分配给128个数字,因此每个ASCII
字符
都可以方便地用一个8位字节表示(最高位始终为0)。有许多将字符分配给256个数字的编码,因此所有编码每个字符使用一个字节。在这些固定宽度编码中,文本字符串的字符数与字节表示的数目一样多。
现在,Unicode也是一种编码,即将含义分配给数字。在前128个数字上,它与ASCII相同,但从理论上讲,它为2 ^
21个数字分配含义。因为有许多含义在写作意义上并不是严格意义上的“字符”(例如零宽度的连接符或变音符号),所以术语“代码点”比“字符”更可取。但是,任何至少21位宽的整数数据类型都可以表示一个代码点。通常,人们选择一种32位类型,这种编码(其中每个元素代表一个代码点)称为UTF-32或UCS-4。
现在,我们有“编码”的第二含义:我可以采取Unicode代码点的串和 变换
成8位或16位值的字符串,从而进一步“编码”中的信息。在这种新的转换形式(称为“ unicode转换格式”或“
UTF”)中,我们现在具有8位或16位值的字符串(称为“代码单位”),但是每个单独的值通常都不对应处理任何有意义的事情-
首先必须将其解码为一系列Unicode代码点。
因此,从编程角度来看,如果要修改 文本
(而不是字节),则应将文本存储为Unicode代码点序列。实际上,这意味着您需要32位数据类型。char
C和C
++中的数据类型通常为8位宽(尽管这只是最小值),而在C#和Java中,数据类型始终为16位宽。可以想到,可以使用8位char存储 转换后的
UTF-8字符串,而16位char可存储 转换后的
UTF-16字符串,但是为了获得原始的,有意义的Unicode代码点(尤其是在字符串的长度(以代码点为单位)),您将始终必须执行解码。
通常,您的文本处理库将能够为您进行解码和编码,因此它们将很乐意接受UTF8和UTF16字符串(但要付出一定的代价),但是如果您想避免这种额外的间接访问,请将您的字符串存储为原始Unicode足够宽的类型的代码点。
以上是 char对象与哪个字符编码(Unicode版本)集相对应? 的全部内容, 来源链接: utcz.com/qa/409307.html