Java 使用缓冲区将字符串转换为UTF-8
我需要将一个(可能较大的)字符串转换为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(
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字符(这也让我感到惊讶)。我将测试它们是否生成异常或替换,但它们确实存在(我决定使用随机生成的字符串进行测试)。