java源码-过滤掉超过3个字节的UTF8字符
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String nickName = "得😩得得😩";
System.out.println(filterOffUtf8Mb4(nickName));
}
public static String filterOffUtf8Mb4(String text)
throws UnsupportedEncodingException {
byte[] bytes = text.getBytes("utf-8");
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
int i = 0;
while (i < bytes.length) {
short b = bytes;
if (b > 0) {
buffer.put(bytes);
continue;
}
b += 256;
if ((b ^ 0xC0) >> 4 == 0) {
buffer.put(bytes, i, 2);
i += 2;
}
else if ((b ^ 0xE0) >> 4 == 0) {
buffer.put(bytes, i, 3);
i += 3;
}
else if ((b ^ 0xF0) >> 4 == 0) {
i += 4;
}
// 添加处理如b的指为-48等情况出现的死循环
else {
buffer.put(bytes);
continue;
}
}
buffer.flip();
return new String(buffer.array(), "utf-8");
}
}
不错好资源 可以用
页:
[1]