char
对象对应的Unicode 字符编码:
C#
爪哇
JavaScript (我知道实际上并没有char
类型,但我假设String
类型仍然是作为Unicode字符数组实现的)
一般来说,编程语言中是否存在使用特定字符编码的通用约定?
答案 0 :(得分:3)
答案 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位的字符串,从而进一步“编码”信息。在这种新的转换形式(称为“unicode转换格式”或“UTF”)中,我们现在有8位或16位值的字符串(称为“代码单元”),但每个单独的值通常不对应任何有意义的事情 - 首先必须将其解码为一系列Unicode代码点。
因此,从编程角度来看,如果要修改 text (而非字节),则应将文本存储为Unicode代码点序列。实际上,这意味着您需要32位数据类型。 C和C ++中的char
数据类型通常为8位宽(尽管这只是最小值),而在C#和Java上,它总是16位宽。可以想象一个8位字符可用于存储转换的 UTF-8字符串,而一个16位字符可以存储转换的 UTF-16字符串,但是按顺序要获得原始的,有意义的Unicode代码点(特别是在代码点中字符串的长度),您将始终必须执行解码。
通常你的文本处理库能够为你做解码和编码,所以他们会愉快地接受UTF8和UTF16字符串(但需要付出代价),但是如果你想省去这个额外的间接,那就存储你的字符串作为足够宽的类型的原始Unicode代码点。
答案 2 :(得分:0)
在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