java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3809|回复: 1

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

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

    [LV.Master]出神入化

    2040

    主题

    3698

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66476

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

    发表于 2015-4-17 13:25:28 | 显示全部楼层 |阅读模式
    在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛$ k9 F  S* i! m! _- G7 [
    . \  e6 f/ G6 g
    4 O, i! M+ ~3 i6 I
    import java.io.UnsupportedEncodingException;" M: W8 N+ Q3 a  S; Q" w2 v1 {& ~7 P. H
    import java.nio.ByteBuffer;
    5 m" v! }0 \' X$ N  F3 ?* J6 S1 N! V) W; X: R0 ~( N) S: C1 Q

    ' @3 \* `  [6 `. u$ n- Apublic class Test {
    ! s: q/ B3 I) d5 m  M  A
    8 u% ~+ @8 E2 Q4 E, t
    7 c# ^7 g7 m# z! i! l( Z, M
            public static void main(String[] args) throws UnsupportedEncodingException {: V1 l5 V2 J7 J( |0 x( B
                    String nickName = "得😩得得😩";
    & ]  o7 h8 m  p5 R" s" s/ w7 p' T                System.out.println(filterOffUtf8Mb4(nickName));
    $ E5 y* w  G0 _+ _        }- C" o+ @& b, j' N% x' U
    $ b2 D( D. i) D0 O4 w  T) J

    & n% w! _+ O: ~: j5 r        public static String filterOffUtf8Mb4(String text)
    4 E9 b, ~" H+ d4 d0 A                        throws UnsupportedEncodingException {6 F0 }8 T0 N) M4 j  s9 L
    # n/ ?" `5 c4 R) P7 P% R

    0 t4 y7 j) H; c/ i4 }2 Z, `, V                byte[] bytes = text.getBytes("utf-8");) ?9 @6 M+ o% e  g; H
    . b0 B8 g  J4 w/ Z

    6 _* C1 [1 Q- N1 }: h                ByteBuffer buffer = ByteBuffer.allocate(bytes.length);8 v* L, V$ E- W' R

    ) t& y" G$ b# T6 z* _/ u

    ( }! _5 @$ |2 u' K  C/ z- Y% y                int i = 0;; Z$ T8 z% w+ T
    - j. U" N  I7 l& L% W' D

    ( [; p9 H) N0 }/ i, a' R                while (i < bytes.length) {
    - A! B) s3 g! o. |) [) ?8 t' d
    ! P+ S) W1 o$ T( W4 W9 s" e" [& |

    " [5 p  v6 L+ t$ v                        short b = bytes;
    ) B# {% G* H* E9 O2 |  M# S8 W4 E, }$ Z9 G  L" d7 f
    2 x7 {2 p. F7 j+ j( F
                            if (b > 0) {$ [. n; i8 `) B& b

      p4 H% k9 j( M5 C8 l8 Z) e' a

    6 ]9 V7 q' Q5 O! r/ a3 L9 B                                buffer.put(bytes[i++]);& a$ m* J" j4 G$ i3 [

    / @1 a2 `' a; |% R4 q: }
    : ~2 Y% a6 u- g5 r
                                    continue;0 G6 p$ P* [+ y- w+ k) X

    , y8 s5 R) G) Q# j( X9 S6 A1 _6 t% O

    / N8 q& C+ K, j1 E4 s7 x6 \                        }
    1 o+ N: ~( e2 n# U
    4 j- N/ C$ ~% {1 W

    , D5 @) o7 ~7 U) i                        b += 256;1 c- `' j( l. P4 I; w2 |
    ! `. B6 _" D5 L* x9 F+ D* n3 J9 F

    % W- p" P: \# I, z" o) s+ y                        if ((b ^ 0xC0) >> 4 == 0) {
    8 Q+ T5 `$ i2 \% S* T
    8 K8 [0 e0 M# S% N

    / n7 p% B" v$ b2 e( E% x( f                                buffer.put(bytes, i, 2);
    / c' d: V% w( Q  p! X! S+ k# v! g4 J

    8 S4 r2 G  n; c4 V                                i += 2;
    5 U* D1 `4 h* v0 R# K1 |( @& A4 z5 h; [
    2 w% X0 ]* q$ R5 `  y: A
                            }
    3 N4 k0 I% I# {; N- \; z) C: v1 s8 v' L+ b- _* n/ }$ U8 ]

    # J+ l$ k7 x. l( I9 r                        else if ((b ^ 0xE0) >> 4 == 0) {% n9 y1 V3 y  }: ]  X8 g

    9 x/ \. C3 N% T4 M& F
    . y3 l" H* M( A5 s, Z
                                    buffer.put(bytes, i, 3);
    0 D! B; B8 y) ^2 E  Z# V, i6 G# G6 K0 y8 A; i  E
    9 |# ^! @* A9 ?, b; z" ~
                                    i += 3;0 D; I9 Z5 _9 `7 p

    7 O, t4 x6 R7 f  l7 J# s
    4 }+ S4 o1 D# _
                            }
    ( {! l9 K- q4 S& y& P* u. e2 V- L# G, Z) B" N3 y

      U% \$ ]- N/ q& F                        else if ((b ^ 0xF0) >> 4 == 0) {
    6 N3 A  D+ r0 d9 R$ ?. r6 x/ t& u( X5 ?5 I' ^

    8 Y0 W/ G" Z* k$ Y! ]                                i += 4;0 Q, |! t1 k. o% Y9 l
    - @# `6 T  z- L  _& t
      }( B% L* B- X4 M& ?. R2 a: q6 W
                            }' [  i" _4 x3 A
                            // 添加处理如b的指为-48等情况出现的死循环7 |; W. ]1 P4 `4 ]( O5 k8 l
                            else {
    ; S2 W& a( D0 F1 [4 d1 o' p                                buffer.put(bytes[i++]);
    + h& t; _* U1 z0 D, o6 B4 a6 T* }# T- K8 }- D" U6 F
    : t" W+ D4 M" q! h4 K
                                    continue;
    ( x" t! Q# ]6 T) ^: x- B                        }( J! @' m. R4 G% ^3 |$ l
    6 q0 e$ Y! E& v9 [* Z1 r

    : \- p! V$ {8 x- A5 Q# b                }
    6 O' n( s+ Q5 T& T6 ^# V& n3 `& F0 h6 _" q) J: l
    - r( V, _# [% n" j$ ]  G6 a
                    buffer.flip();) ^- m, _' ?8 s

      W9 M4 x1 R0 a* k( `

    ( B! v9 L) _+ S* T                return new String(buffer.array(), "utf-8");
    ( R8 {9 P4 }- k& a        }$ m, z  S4 O* I* s. m3 f" U% N& B
    4 T. g6 X" W3 g/ @+ D$ r) N- T8 ]
    ) x/ p, n, l  ]
    }
    ' p& d3 G: A  j, m+ Q( N% M3 Y( H8 N5 D; r8 |

    ! e6 i/ d7 H1 _* }& @/ z: s
    回复

    使用道具 举报

  • 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-1-22 15:59 , Processed in 0.324476 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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