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论坛
    ( k7 `( G* `) \! N$ U- _2 c% @- s0 f7 q$ ^- r# n. [
    0 Y. K7 F& T4 Y8 e
    import java.io.UnsupportedEncodingException;
    7 p2 c* ]/ C3 C$ @" limport java.nio.ByteBuffer;
    $ D+ Y3 Q" u& M8 ]) m+ E8 |* Z: {+ \3 }' Y

    & U0 o* c2 ~* }& w; D6 D4 Rpublic class Test {
    ( q* W: l9 T, L: s' g, B4 G
    * i. d5 K! z, A6 `  ]5 i

    ( ^5 J& a9 n5 P& Q8 b        public static void main(String[] args) throws UnsupportedEncodingException {
    7 d* v; h% C* p" V/ ~                String nickName = "得😩得得😩";
    4 P: b5 Q" c2 I9 R# G9 u                System.out.println(filterOffUtf8Mb4(nickName));. ]9 p* p0 H2 Z8 n( W% m
            }! R% L! ]  V$ ]  N; e6 ^% a! I) v
    6 H: l) a/ ~+ K  I2 r7 n4 N

    0 N( h4 c% N4 p0 G/ n  N/ x/ ^        public static String filterOffUtf8Mb4(String text)* m6 I* N2 P1 R: A
                            throws UnsupportedEncodingException {
    0 q+ i4 `! A# r/ O) F7 B, r
    ! a% S7 O( W/ d$ G" d5 s( `8 C+ K
    2 \, W! G7 v7 w9 C
                    byte[] bytes = text.getBytes("utf-8");
    / |5 ]9 E7 S2 X5 O6 z* {% ~; M9 |( ]

    7 P* B$ @* o$ H                ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
    + w% s: Z. B* X% X/ M$ ]
    6 H2 ?. a$ K+ |8 h

    3 N/ g4 d( r/ B7 @2 v5 v" S' ?                int i = 0;7 J% I* F3 t8 W9 U
    8 F3 R. ?: P  s% J( b- l! L* S3 ?
    % d3 f) [+ [* e$ i2 a9 I0 E
                    while (i < bytes.length) {
    ; L  P* N* B* f- V2 r7 e$ p8 p" l  r+ J1 t9 X- T; X+ s
    ) |* a( }. I) T  I0 o
                            short b = bytes;
    . Z9 g9 m3 p+ }5 O' q
    ) J  F: w8 \3 V. |2 i
    0 \3 E' W& m) u  f* o7 ?9 _
                            if (b > 0) {
    ' w$ \' M9 g: L) ^6 J( G/ b  K$ s+ V0 O
    , a! |, U0 I/ }: v4 X5 J
                                    buffer.put(bytes[i++]);0 l" e* U# I- d, [1 F" E+ T2 ?

    7 x1 ]' z0 T! r1 M+ L, d; a
    ) Y$ R6 D3 ~: V& E: g0 u" K3 R* r- L
                                    continue;" {" x) S* d0 T5 t7 @- H
    . I; V! S6 ~! O6 p) a& ]
    2 L  V! N1 ?! e7 }% {6 X2 B
                            }$ a% {1 G1 Z/ j% g9 ?7 F: N

    ; d! _/ |2 ~0 L9 `2 q

    # f+ z! @/ [/ X                        b += 256;
    5 |# K! e% j" i1 C, S
    1 |. V, ^' Y+ j; \

    - Z5 T; H) T6 }                        if ((b ^ 0xC0) >> 4 == 0) {
    ! q7 ^3 V& x2 z& p' c
    : E6 ]. l: _; K/ f
    & O" R6 ^# Y# `9 O9 F, R3 _
                                    buffer.put(bytes, i, 2);
    - E/ Z) B) C4 G% P1 ^4 Q8 G1 Z) O
    ) |) i- A4 V: S! g
    ; ?2 T; d& ~# e' f
                                    i += 2;
    2 I# a6 \9 ?7 I; O0 o5 Y% ?/ d
    + E4 |+ J, |: r5 b( P( t
    5 H: {1 G* A1 n3 y4 n
                            }
    , J) X: N0 q. a8 n  [- t+ K: ~8 q4 J% W9 S. r, I) R% R

    / F2 X- s; d+ r  K- @( m6 H/ ^                        else if ((b ^ 0xE0) >> 4 == 0) {
    # l: f$ g/ c, D
    ' }& S4 Q( ^/ r( j( z# z' |
    , O( h9 r' N2 _! v/ u
                                    buffer.put(bytes, i, 3);
    ) p6 Y( l0 Q) c% J# D0 G) Q8 d) \! W3 U, h  K. s1 o

    8 P, f+ K3 Y7 q$ _: |' T) w                                i += 3;
    4 z+ p9 M0 E; e$ h6 g. Q* d' }) g- I1 p+ U' Q' C" o9 k

    / m& y, o  S6 H+ ]" Q" R- g' i- h                        }. Q+ H' N8 S% v* X) m. o/ `; x
    0 j; T" ^& H( N/ T: }5 ]+ A: F8 g

    8 n, ]: A5 q5 R( d$ b' e                        else if ((b ^ 0xF0) >> 4 == 0) {
    5 P; b; a' X- ^+ [1 Y
    , K3 K+ j8 E7 B8 u6 |

    $ _$ R9 c1 g8 P- @8 A# |$ g$ G                                i += 4;2 W/ i6 l- L/ I0 [6 i

    5 v5 f& F2 [- d9 p

    3 i, Q- Q) V- V                        }- A. t, u3 Q0 Z7 e+ c
                            // 添加处理如b的指为-48等情况出现的死循环( H: K( q* {* k: `- C: o' B
                            else {
    2 c" R/ t+ l9 M                                buffer.put(bytes[i++]);' @6 Q/ _# I/ j$ \  E# {4 P

    5 I& u, @  u1 ^: C. S. ^% @/ F; Z

    / G& @, P  c3 j& X" w                                continue;& ]( l" C6 n2 ?  t0 M
                            }; w  F2 E% d7 G! ?

    ' d- Z" C; m+ }8 y
    ' g' o" B" W* u
                    }
    / j8 ^) j) q6 k" Q) M9 J6 X+ _6 f$ @; U" e7 M
    ! O% a, t- t" [  F
                    buffer.flip();
    + y& h' a. d$ W' y8 K6 O* V
    . k/ a2 ]( _6 f9 {7 Y9 q

    6 f5 A5 ^0 }6 n# L: z                return new String(buffer.array(), "utf-8");
    4 o6 ^- g7 i7 l! L, F        }) F) A: M2 }6 ^

    8 g2 E  r# d# Q

    # I' k! t' g( t7 c}/ Z% C1 I) d8 h$ b7 |

    7 k( q8 V$ ^# @  f# U( F# l
    , p/ O, i: g- W& }7 ]5 ^/ \
    回复

    使用道具 举报

  • 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:42 , Processed in 0.379420 second(s), 32 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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