在文本字段中,如果我从单词复制,则插入垃圾字符。从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”。
答案 0 :(得分: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();
首先,您必须对文本进行编码,然后对编码结果进行解码。
答案 1 :(得分:1)
如果您从Microsoft Word复制文本,它具有“智能引号”功能,有时在编码/解码时会跳闸。尝试使用编码Windows-1252
作为源编码。另外,我建议您使用String#getBytes(String)
和String#String(byte[],Charset)
进行转换,无需在此级别使用缓冲区。
答案 2 :(得分:0)
Martijn Courteaux的答案应该会给你预期的输出。但尝试使用服务器设置CHARACTER
和COLLATION
。设置为UTF-8
。
我希望它能奏效。
答案 3 :(得分:0)
请检查网络/应用程序服务器是否正在发送正确的数据。
您使用的是哪个网络/应用程序服务器?
您使用的是简单的文字字段还是其他字段?