java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3852|回复: 1

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

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

    [LV.Master]出神入化

    2093

    主题

    3751

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66773

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

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

    $ h8 X4 M/ q1 r3 C

    & w; \6 U; _; b- Timport java.io.UnsupportedEncodingException;) ~  }: q/ J  C1 E  t( J" Q, a
    import java.nio.ByteBuffer;
    + b3 {. [2 R. L, k4 Q. Y2 U
    7 ^7 ~' h; ~- [+ }5 `# ]
    / q8 q, b( ^  B1 y
    public class Test {7 |; i& m( c/ ]+ O

    $ t% c# G$ t' v, A' H5 A
    : ], J% q. z  t" d2 r
            public static void main(String[] args) throws UnsupportedEncodingException {" D  b  {8 X4 C+ N; x0 Y
                    String nickName = "得😩得得😩";( ~/ `$ V4 y' f4 Y) k. l$ _
                    System.out.println(filterOffUtf8Mb4(nickName));
      f* y+ ?% s; y- F8 {  X        }9 {! q) U0 _; F; V

    1 N# P0 G, u  |/ [* R6 C, `
    / n% A$ Y" [2 W6 R/ x; |( n
            public static String filterOffUtf8Mb4(String text)0 Z; W+ \1 N# F% ^  _& I" s: L
                            throws UnsupportedEncodingException {
      u/ J! a: t; h3 h0 Y
    - C; r, e3 r+ }* m% Y# Z" v

    0 z- B( r$ Z0 R) R; `  }8 f                byte[] bytes = text.getBytes("utf-8");- g$ a$ }" b- H- V; W7 ^

    , ^: b$ a" u, Y

    6 f+ J* K3 n/ Q7 j  D                ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
    3 _0 ^% w+ U; d% }
    % n; E( J9 B4 o

    ! |6 K. Q1 x: `6 o                int i = 0;
    # p8 q- C$ H/ a0 j* ~! d
    7 G" I1 {6 O' u: @

    . K+ m, p5 M0 ], K4 C3 G( P                while (i < bytes.length) {# z7 N0 M, h" \. [( @# v
    ' S; J" m# c! R: F! I4 N
    ) U7 i8 J2 B, Q# d2 y$ J
                            short b = bytes;
    , T- H6 a2 w- s6 O' L' t# L" |$ j& K- A6 [" |3 ^2 E; P
    1 D, A0 Y7 V- e+ ?% X
                            if (b > 0) {
    4 b0 Y1 e$ O" m. S# t  V9 u# Y+ V& [) N

    " \/ x# _' l* L: i9 e  w9 A" y                                buffer.put(bytes[i++]);
    - [2 m! {) ^, j5 B0 v- o; z& b( [6 F6 S
    $ i! n2 n- G& o3 {8 s3 Q
    4 k: X  o" ?: h
                                    continue;
    8 q- d2 M9 p7 C
    5 T% E. K7 P* K  t: y& N

    ! X7 @- H, ?3 }$ a                        }
    , J8 w+ v8 U( j. C+ J7 h$ h% _  y: U+ e/ O# H$ q3 H. ^

    3 n1 O0 H. \; m) t/ D8 a/ g. {                        b += 256;& X5 Y& [+ \  F  k( q: A
    * c6 ]# t( k$ @4 x+ W% i

    ) b/ d, m- N" ]/ [# O  a' _* y# p                        if ((b ^ 0xC0) >> 4 == 0) {
    ( ^. J2 u7 r4 |0 L% R4 y
    2 _, R9 e% u9 m# B. ^5 O, t

    " M- t7 P% f) _/ b                                buffer.put(bytes, i, 2);
    ; a5 e1 m" ?& g) ]  M8 w4 k. J% o# i/ D0 k# o+ R/ M% L& r
    9 S. `; F  N5 g
                                    i += 2;
    1 W2 O& ~1 r& e5 ~0 W" n0 u) l5 m1 H
    ) d: s* e% Y) a- T% Y
                            }
    6 A! L( E% X! U( t1 ^4 s: {7 Y1 N8 p  {: O& r
    , Q4 i( J0 S: @6 W  ~
                            else if ((b ^ 0xE0) >> 4 == 0) {7 Y$ D5 @0 k) C6 M) z6 w, {: Z
    6 h5 N- H6 i" N! [  W) F
    4 ]; T/ X2 O1 n% `# }# u6 A, w, M2 C
                                    buffer.put(bytes, i, 3);8 G  v5 U+ O* @) ]) c" o- u2 N" ~

    , k; @% x* a: b) J, v. o% [

    ( M0 t; q" s# K- I" |  T                                i += 3;3 J. T% V) l3 _

    0 i; \& a1 v* G" [

    / R( h$ e* L4 |& O. Z% j                        }
    * @1 r' j4 q, Y" U9 C; w- o4 Z9 k8 d5 F. _3 }
    : d) B6 m! C- h$ M
                            else if ((b ^ 0xF0) >> 4 == 0) {" {% D5 w7 \. B. d' [2 A% m  E5 n
      `4 n; B* v( M
    # U2 h0 Z# p: d" m7 q+ ]& ^/ ^) {! c% ]
                                    i += 4;% F, i* t! }) s1 p  e& H
    6 u+ B: Y6 o- j7 }8 A

    0 C3 L4 v4 Q& J3 s0 K  j                        }
    ( x8 {: S8 g# ]$ R                        // 添加处理如b的指为-48等情况出现的死循环
    ! `6 {. Q4 N% m                        else {
    & S7 c, K% j+ U                                buffer.put(bytes[i++]);' ^3 m9 _' c& K( Q" z; O
    ) g: E8 S) e+ y* Y0 e( Z

    $ ?5 `  {6 B6 _2 T) K                                continue;3 I7 \9 A6 P+ _) R
                            }
    ) e# N5 {8 l/ w9 B5 V8 c  h" b
    1 i; q' n5 w: k7 P0 `9 f$ U, e. w

    - c% A7 j+ T& y8 [9 ^2 X                }& I" g" J) K- f' S2 }

    0 @0 m% B4 A4 s
    5 J/ j9 ~4 M( H, R: [! v% }4 \
                    buffer.flip();! D9 ]  M% I* p
    $ l! `1 r/ \/ t
    ( y4 s5 S% M3 m! j9 L; K6 P
                    return new String(buffer.array(), "utf-8");
    # D- w7 O7 J4 Q! o        }. c3 @$ u) t6 G
      p" ?( X$ H! ?7 A7 V1 B

    * T9 m1 d6 j' o  l$ R1 j}
    ; u7 g$ l: I. T. G1 T1 q; O6 C" x2 e0 e: c
    5 k) C' c! X. e' M, O" X. @
    回复

    使用道具 举报

  • 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, 2025-3-29 08:21 , Processed in 0.159531 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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