java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3762|回复: 1

java源码-过滤掉超过3个字节的UTF8字符

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66375

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2015-4-17 13:25:28 | 显示全部楼层 |阅读模式
    在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛
    . T# ^* s5 J* t+ d& K
    $ u' s+ c, Z- c" k

    ' u0 E! T5 @9 E1 nimport java.io.UnsupportedEncodingException;& W0 h: a# N& l& T+ k+ a
    import java.nio.ByteBuffer;
    , n* U1 c+ p2 b" j+ t+ x3 `* R3 p# B/ C9 y
    1 [9 O# R4 q! S& l
    public class Test {0 ]; ]1 `6 C+ W$ i  H# U. K
    % E) Z- ^; N0 @) j
    3 a, k! b3 y- W. _% g" E
            public static void main(String[] args) throws UnsupportedEncodingException {7 X' j# ^4 r' ~5 I7 G! A. m/ i
                    String nickName = "得😩得得😩";
    9 H7 o: ]3 T3 Q- k% W                System.out.println(filterOffUtf8Mb4(nickName));
    # C! L" s" n2 t" e        }1 N3 r; b/ h0 a# }. `' G
    / k- m) F8 ~7 P# R* y9 N0 i! L8 Q( m

    & G' Q8 s: w' I0 @% X0 [: z        public static String filterOffUtf8Mb4(String text)9 N) E3 F; c7 g8 q$ [
                            throws UnsupportedEncodingException {
    ! d) {1 r4 C& k, X1 U& l/ E; M/ L6 S9 w& R8 L% c9 Z0 V: I

      F! H6 J& D4 V) X2 [! V                byte[] bytes = text.getBytes("utf-8");
    # H! z) G- F) {8 t: m7 ^; K! d
    7 _) x- J7 x: l, n' `! f

    9 G% }3 i- |: E( J$ Y1 M                ByteBuffer buffer = ByteBuffer.allocate(bytes.length);- r+ ^$ j3 \1 D- P+ R
    # M# Y6 P" L8 ~+ k7 E/ Y0 M
    % c' x% E" [; m  c9 N1 r
                    int i = 0;
      N+ v- h3 ^8 C1 h, C2 M. ]. C+ k; Q1 k8 X
    + ~# _- K: l+ q  [
                    while (i < bytes.length) {! f4 K! M. C$ C& O' S+ X+ k0 X

    / r( ]4 n- k  ?2 g2 v  O, I" O
    0 C3 }6 V% r. h! Y- f
                            short b = bytes;! D, ]6 I$ F! o$ @# B# {
    - O( H0 @! O* h3 W4 I: _3 S3 k
    + O% d9 V5 b( o
                            if (b > 0) {
    : i! H# _; i! p6 k  t$ A- R+ V' }0 c# N# L7 j) Z8 l3 m/ a4 `
    0 K/ y, u/ Y8 i1 t( r
                                    buffer.put(bytes[i++]);/ y! s) B" Q' H0 @) B( V" P7 L  w. U

    2 u3 b1 Q$ _& J
    # H6 j) g) G0 {% T! X- A
                                    continue;
      D1 c+ L" R% A& v2 u4 F# X: m/ z' l3 V
    - o+ E" i2 F- e/ S$ K- J
    ! o' S! |# |) A7 C; S
                            }
    ! Z4 E* x2 V( h$ p' C8 R  b& g9 l. B) `( _& Y2 ^# e

    - o- B" k3 d+ x. X- ?5 i                        b += 256;
    ; t$ B! a2 D' w
    ; C$ W& e: Y. M% w* m) ?
    , q0 b% ?$ V9 X
                            if ((b ^ 0xC0) >> 4 == 0) {
    7 \+ C7 H: L# z% b* \2 R( A, t# z- i( T9 C
      B4 S! L" r9 A
                                    buffer.put(bytes, i, 2);+ e! K$ |4 j8 F7 j, s9 X
    2 P4 o6 h& f7 S1 t7 T
    5 q. R* p2 k- _8 r$ q6 O
                                    i += 2;
    , E6 e# [% j+ B3 |% Q
    % l. O, Y2 L  i" i, g8 K
    & V( y- F. m0 M+ I5 o
                            }
    " H( V8 f# l3 K4 }$ c4 _, P3 o6 n
    / g; M% t4 ^* ?$ |6 w* \

    : P) w0 K/ F! F: y8 z                        else if ((b ^ 0xE0) >> 4 == 0) {
    ) I+ ^0 H/ A7 f1 u' ?4 K  D) K$ g$ C0 ?0 e  u% w
    % R. B0 R7 U; j5 G% G9 c
                                    buffer.put(bytes, i, 3);
    3 x9 X, l+ w7 N# V# ]3 q1 ^) k
    9 W4 l: p% p! r* @
                                    i += 3;
    ) p) o3 _7 q% u+ Q0 _$ f- [6 c: e% S: t

    % O8 b. x* H# U                        }, {  z# {* q0 k% m" J; [
    ' r6 q. B+ Q" K3 n
    7 I$ o1 y( S9 n( u
                            else if ((b ^ 0xF0) >> 4 == 0) {
    & e- u# }: V) z/ Y9 r) b+ i" v) }6 M2 j7 |9 I) i  \4 X( E

      L- H; n/ p3 z* w$ w8 e8 |                                i += 4;  S! r9 C' b1 D: W

    : X% X- o. M# Z$ X. j  K% M
    ; p7 S- }8 C$ t* R% ^4 x
                            }
    ) r9 {* n) a; K+ T                        // 添加处理如b的指为-48等情况出现的死循环: E! L% @4 e6 i
                            else {% s3 K7 U( r: l* @( y9 K& H* z  L- S/ }
                                    buffer.put(bytes[i++]);
    5 l4 \. C% C# t0 e2 w/ C$ [& C
    # s0 q( M2 M  v6 X  B: w/ G/ F6 X
                                    continue;; D7 z1 I" F) v8 l6 ~
                            }
    / R/ ~" l0 Z) M4 n9 Q6 s: [) _( R. }- X) h8 U+ F3 B; m
    / X" k4 H0 @! U+ ]4 X
                    }' v' j; I# T% G' B

      ^# M, [9 `9 D( V* U, W8 g

    ) I* M; [7 A- b/ E3 y( p( R                buffer.flip();
    ' Z5 f0 w$ X# f& \% x
    3 ]- V  m( t' c! v: r! ^
    5 O/ q: p* w( g6 f' R, ?
                    return new String(buffer.array(), "utf-8");+ q7 @, P; _& S0 I  Q$ f. ?* a
            }
    * {( c- z# G0 M" }6 t
    ! T, u3 P8 v" p+ l5 m  ^8 }

    0 J$ |* a4 D* v}  \9 G2 W/ U( s! f, Y% N" a
    , [5 A' a" w- _1 S
    . O4 m4 ]7 M. p9 v3 j
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-10-22 10:22
  • 签到天数: 26 天

    [LV.4]略有小成

    2

    主题

    35

    帖子

    385

    积分

    普通会员

    Rank: 2

    积分
    385
    发表于 2015-11-1 17:44:30 | 显示全部楼层
    不错好资源 可以用
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2024-12-22 14:52 , Processed in 0.124188 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表