char对象对应于哪个字符编码(Unicode版本)集

本文关键字:Unicode 版本 编码 字符 对象 于哪个 char | 更新日期: 2023-09-27 18:00:48

char对象在中对应于什么Unicode字符编码

  • C#

  • Java

  • JavaScript(我知道实际上没有char类型,但我假设String类型仍然实现为Unicode字符数组)

一般来说,编程语言之间是否有使用特定字符编码的通用约定?

更新

  1. 我试图澄清我的问题。下面的评论中讨论了我所做的更改
  2. 回复:"你想解决什么问题?",我对从独立于语言的表达式生成代码感兴趣,并且文件的特定编码是相关的

char对象对应于哪个字符编码(Unicode版本)集

在C#和Java中,它是UTF-16。

我不确定我是否在回答你的问题,但让我说几句话,希望能有所启发。

从核心上讲,像我们正在讨论的那些通用编程语言(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位的数据类型。在C和C++中,char数据类型通常是8位宽(尽管这只是最小值),而在C#和Java中,它总是16位宽。8位字符可以用来存储转换的UTF-8字符串,16位字符可以存储UTF-16转换的字符串,但为了获得原始的、有意义的Unicode代码点(尤其是代码点中的字符串长度),您必须始终执行解码。

通常,您的文本处理库能够为您进行解码和编码,因此它们会很乐意接受UTF8和UTF16字符串(但要付出一定的代价),但如果您想避免这种额外的间接性,请将字符串存储为足够宽类型的原始Unicode代码点。

在Java中:

char数据类型是单个16位Unicode字符。

取自http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

在C#中:

单个Unicode字符

取自http://msdn.microsoft.com/en-us/library/ms228360(v=vs.80).aspx