javazx 发表于 2015-4-17 13:25:28

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");
        }


}


AddisCB 发表于 2015-11-1 17:44:30

不错好资源 可以用
页: [1]
查看完整版本: java源码-过滤掉超过3个字节的UTF8字符