Java 使用缓冲区将字符串转换为UTF-8

Java 使用缓冲区将字符串转换为UTF-8,java,unicode,utf-8,character-encoding,buffer,Java,Unicode,Utf 8,Character Encoding,Buffer,我需要将一个(可能较大的)字符串转换为UTF-8,但我不想创建包含完整编码的字节数组。我的想法是使用CharsetEncoder,但是CharsetEncoder只作用于CharBuffer,这意味着应该考虑补充字符(Unicode范围0x0000到0xFFFF) 现在我使用的方法是CharBuffer.wrap(String.substring(start,start+BLOCK_SIZE)),我的ByteBuffer是使用ByteBuffer.allocate((int)Math.ceil(

我需要将一个(可能较大的)字符串转换为UTF-8,但我不想创建包含完整编码的字节数组。我的想法是使用
CharsetEncoder
,但是
CharsetEncoder
只作用于
CharBuffer
,这意味着应该考虑补充字符(Unicode范围
0x0000
0xFFFF

现在我使用的方法是
CharBuffer.wrap(String.substring(start,start+BLOCK_SIZE))
,我的
ByteBuffer
是使用
ByteBuffer.allocate((int)Math.ceil(encoder.maxbytespercar()*BLOCK_SIZE))创建的。但是,
CharBuffer
现在将包含
BLOCK\u SIZE
代码点,而不是代码单位(字符);我认为实际字符数将是最大字符数的两倍。这意味着我的
ByteBuffer
也太小了两倍

如何计算我的
ByteBuffer
的正确字节数?我可以简单地将它加倍,以防每个字符都是补充字符,但这似乎有点过分。但唯一合理的选择似乎是迭代所有代码单元(字符)或代码点,这至少看起来不太理想

有没有关于分段编码字符串的最有效方法的提示?我应该使用缓冲区,使用
String.codepoint(location)
的迭代,还是有直接处理代码点的编码例程



附加要求:无效字符编码应导致异常,不允许默认替换或跳过无效字符。

简单地包装整个字符串,然后盲目读取字符,直到没有剩余字符。无需将字符串分成几部分,编码器只需读取字节,直到输出缓冲区填满:

final CharsetEncoder encoder = StandardCharsets.UTF_8.newEncoder();
final CharBuffer buffer = CharBuffer.wrap(input);
final ByteBuffer encodedBuffer = ByteBuffer.allocate(BUFFER_SIZE);
CoderResult coderResult;

while (buffer.hasRemaining()) {
    coderResult = encoder.encode(buffer, encodedBuffer, false);
    if (coderResult.isError()) {
        throw new IllegalArgumentException(
                "Invalid code point in input string");
    }
    encodedBuffer.flip();
    // do stuff with encodedBuffer
    encodedBuffer.clear();
}

// required by encoder: call encode with true to indicate end
coderResult = encoder.encode(buffer, encodedBuffer, true);
if (coderResult.isError()) {
    throw new IllegalArgumentException(
            "Invalid code point in input string");
}
encodedBuffer.flip();
// do stuff with encodedBuffer
encodedBuffer.clear(); // if still required

您想对utf-8字节做什么?是否有理由不只是使用BufferedWriter包装FileWriter或OutputStreamWriter;两者都可以在构造时定义要使用的字符编码(utf-8)。
FileWriter
不可能,因为默认的字符编码,
OutputStreamWriter
使用字符替换,我也不希望使用字符替换。无论如何,我想我可以回答我自己-你可以简单地将整个
字符串
实例包装起来。@BrettOkken的主要任务是将其输入
消息摘要
。如果你要使用utf-8,就不应该有任何字符替换。@BrettOkken似乎有一些字符代码不被接受,即使是Unicode字符(这也让我感到惊讶)。我将测试它们是否生成异常或替换,但它们确实存在(我决定使用随机生成的字符串进行测试)。