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

char对象对应的Unicode 字符编码

  • C#

  • Java的

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

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

更新

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

我不确定我是在回答你的问题,但是让我发表几点意见,希望能够解释一下。

在核心,通用编程语言,如我们所讨论的(C,C ++,C#,Java,PHP),没有“文本”的概念,只有“数据”。 数据由整数值序列(即数字)组成。 这些数字背后没有固有的含义

将数字流转换为文本的过程是语义之一,并且通常由消费者将相关语义分配给数据流。

警告:我现在将使用“编码”这个词,遗憾的是它具有多种不等价的含义。 “编码”的第一个含义是赋值给数字。 数字的语义解释也称为“字符”。 例如,在ASCII编码中,32表示“空格”,65表示“captial A”。 ASCII仅为128个数字赋值,因此每个ASCII 字符可以方便地用一个8位字节表示(最高位始终为0)。 有许多编码将字符分配给256个数字,因此每个字符使用一个字节。 在这些固定宽度编码中,文本字符串具有与要表示的字节数一样多的字符。 还有其他编码,其中字符采用可变数量的字节来表示。

现在,Unicode也是一种编码,即对数字赋值。 在前128个数字上它与ASCII相同,但它赋予(理论上)2 ^ 21个数字的含义。 因为在写作的意义上有很多不是严格意义上的“字符”(例如零宽度连接符或变音符号修饰符),所以术语“代码点”优于“字符”。 尽管如此,任何至少21位宽的整数数据类型都可以代表一个代码点。 通常,一个选择32位类型,并且此编码(其中每个元素代表一个代码点)称为UTF-32或UCS-4。

现在我们有了“编码”的第二个含义:我可以使用一串Unicode代码点并将其转换为8位或16位值的字符串,从而进一步“编码”信息。 在这种新的转换forms(称为“unicode转换格式”或“UTF”)中,我们现在有8位或16位值的字符串(称为“代码单元”),但每个单独的值通常不对应任何有意义的事情 – 首先必须将其解码为一系列Unicode代码点。

因此,从编程角度来看,如果要修改文本 (而不是字节),则应将文本存储为Unicode代码点序列。 实际上,这意味着您需要32位数据类型。 C和C ++中的char数据类型通常为8位宽(尽管这只是最小值),而在C#和Java上,它总是16位宽。 可以想象一个8位字符可用于存储转换后的 UTF-8字符串,而一个16位字符可以存储转换后的 UTF-16字符串,但是为了获得原始的,有意义的Unicode代码点(特别是在您必须始终执行解码,这是代码点中字符串的长度。

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

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

在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