Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中字符串的字符编码是什么?_Java_String_Character Encoding - Fatal编程技术网

Java中字符串的字符编码是什么?

Java中字符串的字符编码是什么?,java,string,character-encoding,Java,String,Character Encoding,实际上,我对Java中字符串的编码感到困惑。我有几个问题。如果您知道答案,请帮助我: 1) 内存中Java字符串的本机编码是什么?当我写String a=“Hello”时,它将以哪种格式存储?由于Java是独立于机器的,我认为系统不会进行编码 2) 我在网上读到“UTF-16”是默认编码,但我感到困惑,因为当我写inta='c'时,我得到了ASCII表中字符的编号。那么ASCII和UTF-16是一样的吗 3) 我也不确定字符串在内存中的存储取决于什么:操作系统,语言 Java在内部将字符串存储为

实际上,我对Java中字符串的编码感到困惑。我有几个问题。如果您知道答案,请帮助我:

1) 内存中Java字符串的本机编码是什么?当我写
String a=“Hello”
时,它将以哪种格式存储?由于Java是独立于机器的,我认为系统不会进行编码

2) 我在网上读到“UTF-16”是默认编码,但我感到困惑,因为当我写
inta='c'
时,我得到了ASCII表中字符的编号。那么ASCII和UTF-16是一样的吗

3) 我也不确定字符串在内存中的存储取决于什么:操作系统,语言

  • Java在内部将字符串存储为UTF-16

  • “默认编码”不太正确。Java在内部将字符串存储为UTF-16,但在外部使用的编码“系统默认编码”因平台而异,甚至可以通过某些平台上的环境变量等更改

    ASCII是拉丁1的子集,拉丁1是Unicode的子集。UTF-16是一种Unicode编码方式。因此,如果您对ASCII范围内的任何字符执行
    inti='x'
    测试,您将获得ASCII值。然而,UTF-16可以表示比ASCII多得多的字符

  • 从:

    Java2平台在char数组、String和StringBuffer类中使用UTF-16表示

    因此,UTF-16被定义为Java 2平台的一部分,用于这些类


  • 虽然这不能回答你的问题,但值得注意的是。。。在java字节码(类文件)中,字符串存储在UTF-8中

    编辑:感谢LoadMaster帮助我更正我的答案:)

    1) 所有内部字符串处理都使用UTF-16进行

    2) ASCII是UTF-16的子集

    3) Java内部使用的是UTF-16。对于其余部分,这取决于您的位置,是的。

    1)字符串是对象,通常包含
    char
    数组和字符串的长度。字符数组通常实现为16位字的连续数组,每个字包含一个本机字节顺序的Unicode字符


    2) 将字符值指定给整数可将16位Unicode字符代码转换为其等效整数。因此,
    'c'
    ,即U+0063,变为
    0x0063
    ,或99

    3) 由于每个
    字符串
    都是一个对象,因此它包含除类成员以外的其他信息(例如,类描述符字、锁/信号量字等)

    ADENDUM
    对象内容取决于JVM实现(它确定与每个对象相关联的固有开销)以及类的实际编码方式(即,某些库可能比其他库更高效)

    示例
    典型的实现将为每个对象实例分配两个字的开销(对于类描述符/指针和一个信号量/锁控制字);
    String
    对象还包含
    int
    长度和
    char[]
    数组引用。字符串的实际字符内容存储在第二个对象中,
    char[]
    数组,该数组依次分配两个字,加上一个数组长度的字,再加上字符串所需的16位
    char
    元素(加上创建字符串时留下的任何额外字符)

    附录2
    只有在大多数情况下,一个字符表示一个Unicode字符的情况才是正确的。这意味着编码在2005年之前是正确的。但到目前为止,Unicode已经变得越来越大,字符串必须使用UTF-16编码——在Java
    字符串中,单个Unicode字符可能使用两个
    char
    s


    查看Apache实现的实际源代码,例如:

    ,你应该考虑把这些问题分解成个别问题,因为它们确实非常不同。这里可能可以回答2:字符串作为
    char[]
    存储在内存中,每个元素包含一个16位UTF-16 Unicode字符。UTF-8不用于在内部存储字符串,但用于将I/O流转换为字符串或从字符串转换为字符串。@LoadMaster:在这段时间内它是否发生了更改?Java总是在内部使用UTF-16?是的,
    String
    总是使用内部
    char[]
    来存储其字符值。@Loadmaster我相信这是一个有用的信息,并且我明确提到它是类文件-那么你的问题是什么?但它没有回答问题。您可以将其作为评论发布,并以类似“虽然这不能回答您的问题,但值得注意的是……”的开头。这确实是一条有用的信息,不过,我不知道他们使用了UTF-8。重点是什么?这意味着JVM必须在启动时将每个字符串转换为UTF-16。@Sergey Tachenov:字符串存储为UTF-8,这样.class文件(平均)就更小了。当您像通常那样将它们放在JAR文件中时,这一点都不重要。UTF-16的压缩效率几乎是原来的两倍。@Parser:Oracel的文档对“编码:设置源文件编码名称,如EUC-JP和UTF-8”的要求非常严格,所以这只是源文件(*.java)编码,*.class文件中字符串的编码保留了UTF-8。实际上,您想说什么。它包含其他信息,因此??“将字符值赋给整数会将16位Unicode字符代码转换为其等效整数。”这里有点令人困惑的是,Unicode编码在前256个字符上与ASCII编码一致。Unicode与前256个字符的扩展ASCII(8位)相关;扩展ASCII则直接对应于前128位的7位ASCII。所以“c”在Unicode中编码为0x63,扩展