Java中的垃圾字符去除

9

当我从Word复制到文本字段中时,会插入垃圾字符。在从JSP页面发布参数时,它仍然正常。但是,在Java中获取参数时,它会转换为垃圾字符。我使用了以下代码在插入之前消除垃圾字符。我正在使用MySQL数据库。(JBOSS 5.1 GA服务器)

String outputEncoding = "UTF-8";

Charset charsetOutput = Charset.forName(outputEncoding);
CharsetEncoder encoder = charsetOutput.newEncoder();
byte[] bufferToConvert = userText.getBytes();
CharsetDecoder decoder =  (CharsetDecoder) charsetOutput.newDecoder();
try {
    CharBuffer cbuf = decoder.decode(ByteBuffer.wrap(bufferToConvert));
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(cbuf));
    userText = decoder.decode(bbuf).toString();
} catch (CharacterCodingException e) {
    e.printStackTrace();
}

但是当我使用单引号('')和双引号("")时,仍然会得到垃圾字符。我需要使用UTF-8编码的字符串。有人能建议我哪里出了问题吗?

举例:输入 - "esgh"。 输出 - â??esghâ?? : 期望输出 - "esgh"。


5
可以给一些输入和期望输出的例子吗? - Keppil
1
您的代码示例中未使用inputDecoder变量。这是有意为之还是错误?我认为您应该针对此输入字符类型获取一个Charset实例,并使用它来代替从输出字符集获取的解码器。 - Duncan Jones
@Thor84no 是的,我确定。无论如何,它被存储为数据库中的垃圾数据。 - user1199657
是的。垃圾数据的实际字节显示为-38 0 -98 0 -98 0。 - user1199657
“While posting parameters from jsp page it remains fine”这句话的意思不太清楚。您是如何在Java中确定它无效的呢?仅仅因为数据库出现问题并不意味着Java中的值是不正确的。 - Jon Skeet
显示剩余8条评论
4个回答

5
你需要交换编码和解码的调用顺序。此外,你进行了两次解码,但只有一次编码!
你写道:
CharBuffer cbuf = decoder.decode(ByteBuffer.wrap(bufferToConvert));
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(cbuf));
userText = decoder.decode(bbuf).toString();

但是很显然,它必须是:
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(userText));
CharBuffer cbuf = decoder.decode(bbuf);
userText = cbuf.toString();

首先,您需要对文本进行编码,然后解码已编码的结果。


但是对于类型为 ByteBuffer 的参数,encode 方法不适用。它会抛出错误。 - user1199657
哦,是的,你说得对。同样交换缓冲区。看看我的编辑后的答案。 - Martijn Courteaux
感谢您的努力。但它仍然无法清除垃圾。我得到了与之前相同的结果。 - user1199657
2
你在这里想要实现什么?如果编码器是平台默认值(比如 ISO-8859-1),而解码器是 UTF-8,则你的解决方案肯定会损坏文本。如果你很幸运,平台默认值是 UTF-8,那么这个解决方案就什么也不会做。 - erickson

1

如果您从Microsoft Word复制文本,它会具有“智能引号”功能,有时在编码/解码时可能会出现问题。尝试使用编码Windows-1252作为源编码。此外,我建议使用String#getBytes(String)String#String(byte[],Charset)进行转换,无需在此级别上处理缓冲区。


0

Martijn Courteaux 的回答应该会给您期望的输出。但是一旦尝试使用服务器设置 CHARACTERCOLLATION。设置为 UTF-8

我希望它能够正常工作。


0
请检查 Web/应用服务器是否发送了正确的数据。
您正在使用哪个 Web/应用服务器?
您正在使用简单文本字段还是其他字段?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接