当前位置: 首页 > 面试题库 >

Java UTF-16字符编码

严远
2023-03-14
问题内容

我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将包含6个字符的字符串转换为字节时,我将得到如下所示的6个字节,但我希望它是12。是否缺少任何概念?

package learn.java;

public class CharacterTest {

    public static void main(String[] args) {
        String str = "Hadoop";
        byte bt[] = str.getBytes();
        System.out.println("the length of character array is " + bt.length);
    } 
}

O / p:字符数组的长度为6

根据@Darshan尝试使用UTF-16编码获取字节时,结果也不期望。

package learn.java;

    public class CharacterTest {

        public static void main(String[] args) {

            String str = "Hadoop";
            try{
                byte bt[] = str.getBytes("UTF-16");
                System.out.println("the length of character array is " + bt.length);

            }
            catch(Exception e)
            {

            }
        } 
    }

o/p: the length of character array is 14

问题答案:

在UTF-16版本中,由于插入了一个标记来区分Big Endian(默认)和Little
Endian,因此获得14个字节。如果指定UTF-16LE,则将获得12个字节(小尾数,不添加字节顺序标记)。

参见http://www.unicode.org/faq/utf_bom.html#gen7

编辑- 使用此程序查看由不同编码生成的实际字节:

public class Test {
    public static void main(String args[]) throws Exception {
        // bytes in the first argument, encoded using second argument
        byte[] bs = args[0].getBytes(args[1]);
        System.err.println(bs.length + " bytes:");

        // print hex values of bytes and (if printable), the char itself
        char[] hex = "0123456789ABCDEF".toCharArray();
        for (int i=0; i<bs.length; i++) {
            int b = (bs[i] < 0) ? bs[i] + 256 : bs[i];
            System.err.print(hex[b>>4] + "" + hex[b&0xf] 
                + ( ! Character.isISOControl((char)b) ? ""+(char)b : ".")
                + ( (i%4 == 3) ? "\n" : " "));
        }
        System.err.println();   
    }
}

例如,以UTF-8运行时(在其他JVM默认编码下,FE和FF的字符显示会有所不同),输出为:

$ javac Test.java  && java -cp . Test hello UTF-16
12 bytes:
FEþ FFÿ 00. 68h
00. 65e 00. 6Cl
00. 6Cl 00. 6Fo

$ javac Test.java  && java -cp . Test hello UTF-16LE
10 bytes:
68h 00. 65e 00.
6Cl 00. 6Cl 00.
6Fo 00.

$ javac Test.java  && java -cp . Test hello UTF-16BE
10 bytes:
00. 68h 00. 65e
00. 6Cl 00. 6Cl
00. 6Fo


 类似资料:
  • 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将一个包含6个字符的字符串转换为字节时,我得到了6个字节,如下所示,我期望它是12。我是不是漏掉了什么概念? O/p:字符数组的长度为6 按照@Darshan的说法,当尝试使用UTF-16编码获取字节时,结果也不是预期的。

  • So do not worry about tomorrow, for tomorrow will bring worries of its own. Today's trouble is enough for today. (MATTHEW 6:34) 字符编码 其实,标题前面应该加两个字——“坑爹”。 在实践中,字符编码的确是一个“坑”。因为这个世界上,不都是英文。如果都是英文,就没有这个问题

  • 16 音频编码器 介绍当前可用的音频编码器 aac AAC(Advanced Audio Coding )编码器 当前原生(内置)编码器还处于实验阶段,而且只能支持AAC-LC(低复杂度AAC)。要使用这个编码器,必须选择 ‘experimental’或者’lower’ 因为当前还处于实验期,所以很多意外可能发生。如果需要一个更稳定的AAC编码器,参考libvo-aacenc,然而它也有一些负面报

  • 问题内容: Linux / x86_64上的GCC 4.7是否具有默认字符编码,通过它可以验证和解码C源文件中字符串文字的内容?这是可配置的吗? 此外,将字符串文字从字符串文字链接到输出的数据部分时,它是否具有默认的执行字符编码?这是可配置的吗? 在任何配置中,源字符编码都可能与执行字符编码不同吗?(那gcc会在字符编码之间进行代码转换吗?) 问题答案: 我不知道这些选项的实际效果如何(不使用at

  • 问题内容: 我有一个在GlassFish 3上运行的Java Web应用程序和在MySQL上的JPA(EclipseLink)上运行。我面临的问题是,如果使用该方法将实体保存到数据库中,则字段将丢失完整性;显示而不是某些字符。 服务器,页面和数据库配置为使用。 发布表单数据后,下一页将正确显示数据。此外,它在NetBeans中似乎“调试”当前实体的属性也存储了正确的值。如果可以信任NetBeans

  • 问题内容: 我正在从命令行(Windows 7)运行Java程序。为了简化问题,我仅描述相关部分。 我的输出是垃圾。显然这是一个字符编码问题,Á和á的匈牙利字符未正确显示。我尝试了以下方法: 但是我的输出仍然是垃圾。如何使用Windows 7命令行解决此字符编码问题?谢谢 问题答案: 我通过在命令行中找到正确的编码,然后有你的代码的工作 要么 使用,与编码版本 或 通过指定它的命令行上,只是利用。