当前位置: 首页 > 知识库问答 >
问题:

如何在Java中将CharSequence转换为UTF-8编码的字节数组?

廉宇
2023-03-14

我正在尝试将<code>字符序列</code>转换为UTF-8编码的<code>字节〔〕

我一直有问题,所以我打算向stackoverflow寻求帮助。我打算写一个Java小提琴来做到这一点:

https://www.mycompiler.io/view/3MliN0HgwDD

除了小提琴本身不起作用:

import java.util.*;
import java.lang.*;
import java.io.*;
import java.nio.*;
import java.nio.charset;

// The main method must be in a class named "Main".
class Main {
    public static byte[] charSequenceToUtf8(final CharSequence input)
    {
        //char[] chars = new char[input.length];
        //for (int i=0; i<input.length; i++)
        //  chars[i] = input.charAt(i);

        CharBuffer charBuffer = CharBuffer.wrap(input);
        checkEquals(10, charBuffer.length(), "Charbuffer is wrong length");

        Charset cs = Charset.forName("UTF-8"); 
        ByteBuffer byteBuffer = cs.encode(charBuffer);
        checkEquals(10, byteBuffer.length(), "byteBuffer is wrong length");
        
        byte[] utf8 = byteBuffer.array();        
        checkEquals(10, utf8.length, "utf8 bytes is wrong length");
    }
    
    public static void checkEquals(int expected, int actual, String message)
    {
        if (expected == actual)
            return;
            
        String sExpected = String.valueOf(expected);
        String sActual = String.valueOf(actual);
        
        throw new Exception("Test failed. Expected "+sExpected+", Actual "+sActual+". "+message);
    }
    
    public static void main(String[] args) {
        test("AAAAAAAAAA"); //ten A's
    }
}

看来< code>java.nio至少需要Java 7 ref。这就是为什么它在Java 16中不工作让我感到困惑:

所以这带来了很多问题:

  • 如何将<code>字符序列</code>转换为<code>字节〔〕
  • 为什么它不能在Java16中工作

最后,实际的错误是尝试对字符串 AAAAAAAAA 进行编码会返回一个 11 元素数组

为什么上面的代码,我从链接的问题中窃取,10个字符的字符串失败?

共有1个答案

易阳云
2023-03-14

首先,请注意,如果您有String,那么您可以简单地执行:

byte[] bytes = theString.getBytes(StandardCharsets.UTF_8);

或者,即使您有< code>CharSequence,您也可以:

byte[] bytes = theCharSequence.toString().getBytes(StandardCharsets.UTF_8);

这可能会创建< code>CharSequence的< code>String副本(如果它还不是< code>String ),尽管它应该被快速垃圾收集。

但是关于您的问题,您没有考虑到字节缓冲区的限制(或位置,尽管在本例中是0)。无论出于何种原因,将编码为“aaaaaaaa”会产生一个容量11,但限制为10。但是#array()方法返回整个后备数组,而不管缓冲区的位置或限制。这意味着您需要在将字节缓冲符转换为byte[]”时手动考虑限制(和位置)。

例如:

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Main {

  public static void main(String[] args) throws Exception {
    for (int i = 1; i <= 10; i++) {
      String string = "A".repeat(i);

      CharBuffer chars = CharBuffer.wrap(string);
      ByteBuffer bytes = StandardCharsets.UTF_8.encode(chars);

      System.out.printf("%-10s | %s%n", string, Arrays.toString(toByteArray(bytes)));
    }
  }

  public static byte[] toByteArray(ByteBuffer buffer) {
    byte[] array = new byte[buffer.remaining()];
    buffer.get(buffer.position(), array);
    return array;
  }
}

其将输出:

A          | [65]
AA         | [65, 65]
AAA        | [65, 65, 65]
AAAA       | [65, 65, 65, 65]
AAAAA      | [65, 65, 65, 65, 65]
AAAAAA     | [65, 65, 65, 65, 65, 65]
AAAAAAA    | [65, 65, 65, 65, 65, 65, 65]
AAAAAAAA   | [65, 65, 65, 65, 65, 65, 65, 65]
AAAAAAAAA  | [65, 65, 65, 65, 65, 65, 65, 65, 65]
AAAAAAAAAA | [65, 65, 65, 65, 65, 65, 65, 65, 65, 65]

请注意,上面的示例复制了缓冲区后备数组的一个区域,尽管原始的 ByteBuffer 应该会被快速垃圾回收。我能想到的避免复制支持数组的唯一方法是调整你的代码以直接使用ByteBuffer(如果你只返回支持数组,你就会丢失位置/限制信息)。或者我想你可以创建一个包装类。

 类似资料:
  • 问题内容: 我有一个带有HTML实体的ASCII字符串,例如: 我需要此字符串不包含那些实体,并将其转换为UTF-8字符。有没有简单的方法,在Java中可以做到这一点? 哪里: 返回“aà” 或类似的东西? 问题答案: 看一下org.apache.commons.lang.StringEscapeUtils.unescapeHtml(…)。显然,它可以理解HTML 4中定义的所有字符实体。

  • 本文向大家介绍PHP 将ASCII转换为UTF-8编码,包括了PHP 将ASCII转换为UTF-8编码的使用技巧和注意事项,需要的朋友参考一下 如果我们知道当前的编码是ASCII,则可以使用'iconv'函数将ASCII转换为UTF-8。原始字符串可以作为参数传递给iconv函数,以将其编码为UTF-8。 示例 具有特殊字符的字符串被分配给'str'变量。它以当前所在的编码以及需要转换为的编码传递

  • 在我的Silverlight应用程序中,我得到了一个用windows-1252编码的XML文件。现在我的问题,它不会正确显示,直到Windows-1252字符串转换为UTF8字符串。在一个正常的C#环境中,这不会是一个大问题:在那里我可以做这样的事情: (将字符串的字符编码从windows-1252转换为utf-8) 但是silverlight不支持windows-1252,它只支持unicode

  • 问题内容: 我们有一个系统,客户(主要是欧洲人)输入的文本(使用UTF-8)必须分发到不同的系统,其中大多数接受UTF-8,但是现在我们还必须将文本分发到仅接受美国的美国系统。 -Ascii 7位 因此,现在我们需要将所有欧洲字符翻译成最近的美国Ascii。是否有任何Java库可帮助完成此任务? 现在,我们刚刚开始添加到转换表中,在该表中Å(瑞典AA)-> A等,在找不到与输入字符匹配的位置的情况

  • 我有一个从第三方应用程序收到的字符串,我希望在我的Windows界面上使用C#以任何语言正确显示它。 由于编码不正确,我的字符串中有一段在西班牙语中如下所示: AcciÃn 然而它应该看起来像这样: 阿克松 根据这个问题的答案:如何知道C#中的字符串编码,我接收到的编码应该已经在UTF-8中出现了,但它是在编码时读取的。默认值(可能是ANSI?)。 我试图将这个字符串转换成真正的UTF-8,但问题

  • 问题内容: 我有一个带有“ñ”字符的字符串,并且我有一些问题。我需要将此字符串编码为UTF-8编码。我已经通过这种方式尝试过,但是没有用: 如何将该字符串编码为utf-8? 问题答案: Java中的对象使用无法修改的UTF-16编码。 唯一可以使用不同编码的是。因此,如果你需要UTF-8数据,则需要一个。如果你有一个包含意外数据的,则问题出在较早的地方,该错误地将一些二进制数据错误地转换为a (即