首页天道酬勤java中一个字符占几个字节,java一个中文占几个字符

java中一个字符占几个字节,java一个中文占几个字符

张世龙 05-06 03:11 10次浏览

Java理论上说一个字符(汉字字母)占用两个字节。

但是,对于UTF-8,new String (字) (.getBytes ) ).length表示3个字节

作者: RednaxelaFX

链接: https://www.zhi Hu.com/question/27562173/answer/37188642

来源:知乎

版权归作者所有。 商业转载请联系作者取得许可。 非商业转载请注明出处。

问题主要是明确区分内码(internal encoding )和外码(external encoding )就可以了。 内部代码是程序内部使用的字符编码,特别是某些语言,实现char或String类型在内存中使用的内部代码的外部代码是程序与外部交互时在外部使用的字符编码。 “外部”相对于“内部”,凡是不是char或String用于内存的内部编码的地方都可以认为是“外部”。 例如,外部是序列化的char或String,或者外部文件或命令行参数。 Java语言规范规定,Java的char类型必须为UTF-16的代码单元,即16位(2字节)。 char,wosevaluesare 16-bitunsignedintegersrepresentingutf-16代码单元3.1 ) .然后字符串是utf-16代码单元的序列。 thejavaprogramminglanguagerepresentstextinsequencesof 16-bitcodeunits,using the UTF-16 encoding .或者在字符串内部为非UTF-16 “感知”可以跨越多个方面。 例如,随机访问某个下标的代码单元(string.charat ) )必须是o )1)操作。 这仅在使用UTF-16或其他“固定长度”编码时可用。 请注意,这里的“决定长度”特别是代码单元决定长度,而不是代码点决定长度。 String.getBytes ()是将String的内码转换为指定的外码的方法。 无参数版使用平台的默认代码作为外部代码,无参数版使用参数指定的代码作为外部代码,用外部代码对字符串的内容进行编码,并将结果放入新的byte[]中返回。 在标题的例子中,显然外码是UTF-8,调用String.getBytes ()后得到的byte[]只是表示该外码的性质,不能接触String内码的任何特质。 作为另一个示例,Java标准库实现的char和String序列化规定使用UTF-8作为外部代码。 Java类文件中的字符串常量和符号名称也规定用UTF-8编码。 这可能是当时的设计人员为了平衡运行时的时间效率(采用固定长度代码的UTF-16 )和外部存储的空间效率(采用加长的UTF-8代码)而进行的取舍。 题外话1 :很遗憾,UTF-16在Java设计之初真的是固定长度代码。 此后,Unicode覆盖的字符变多后,UTF-16成为了洞父的可变长度代码。 (完整的“文字”是代码点; 一个代码点可以支持1~2个代码单元; 一个代码单元是16位),Java也必须跟随。 为了实现UTF-16的变长度编码语义,Java规定char仍然只能是16位代码点。 也就是说,在Java的char类型中,一个UTF-16的“字符”——不一定只有一个代码单元的代码点就可以完全存在于char中。 然而,字符串可以包括由两个代码单元组成的“surrogate pair”作为char的排列,并且可以表示需要两个代码单元表示的utf-16代码点。 因此,在Java标准库中添加了用于访问代码点的新API。 该API显示了UTF-16的可变长度特性。 题外话2 :之前说Java的内码时,说得有点松,留下了“并不是总是用UTF-16作为内码,但用户感觉不到区别”的余地。 Sun JDK6提供了名为“字符串压缩”(-XX: UseCompressedString )的功能。 如果启用,则存储在字符串内部的字符串内容为byte[]或char[]; 如果整个字符串中的所有字符都在ASCII编码范围内,则使用byte[](ASCII序列) ]保存并“压缩”字符串。 相反,如果其中一个字符超出了ASCII的编码范围,则返回用char[](UTF-16序列)保存。 ASCII码也是固定长度代码,其覆盖的字符是UTF-16的真正子集的用户在从“压缩”字符串访问内容时,将ASCII字符扩展为无符号,如String.charAt () 这将使用户无法识别Java String的内部代码不是UTF-16。 Sun JDK6未包含在OpenJDK6、Oracle JDK7/OpenJDK7中,因为“压缩字符串”实现不充分,实现太复杂,无法获得效果。

目前,Oracle正在重新审视“字符串压缩”功能,有可能通过JDK9重新实现。 题外话3 :同样规定使用UTF-16作为内码的JavaScript语言,其实现中广泛应用了“压缩字符串”的思想。 目前主流的JavaScript引擎尽可能使用ASCII内码字符串,但用户可以触摸的API只能看到utf-16代码单元。

微型计算机的技术指标,微型计算机内部字节