【问题标题】:Junk character removal in javajava中的垃圾字符删除
【发布时间】:2012-07-22 15:09:28
【问题描述】:

如果我从 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”。

【问题讨论】:

  • 你能举几个输入和想要输出的例子吗?
  • 我举了一个例子。但它也发生在单引号中。
  • 你不能只按 ASCII 值过滤吗?只需取大于 31 且小于 128 的所有值。
  • 您的 inputDecoder 变量未在您的代码示例中使用。这是故意的还是错误的?我原以为您会为此输入字符类型获得一个 Charset 实例,并使用它而不是您从输出字符集中获得的解码器。
  • @DuncanJones 它没有任何区别。无论如何,我正在尝试别的东西。所以发错了。

标签: java mysql string utf-8


【解决方案1】:

您必须交换编码和解码调用。 加号;您正在解码两次,仅用于一次编码!

你写道:

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();

首先,您必须对文本进行编码,然后对编码结果进行解码。

【讨论】:

  • 但是encode方法不适用于参数ByteBuffer。它会引发错误。
  • 哦,是的,你是对的。也交换缓冲区。查看我编辑的答案。
  • 感谢您的努力。但它仍然没有删除垃圾。我得到的结果和以前一样。
  • 你想在这里实现什么?如果编码器是平台默认值(例如 ISO-8859-1)并且解码器是 UTF-8,那么您的解决方案肯定会破坏文本。如果幸运的话,平台默认是 UTF-8,这绝对不会做任何事情。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    我希望它会起作用。

    【讨论】:

      【解决方案4】:

      请检查网络/应用服务器是否发送正确的数据。

      您使用的是哪个网络/应用程序服务器?

      您使用的是简单的文本字段还是其他?

      【讨论】: