java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3738|回复: 1

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66345

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

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

    , B0 v$ a7 j) o: T! x- |9 pimport java.io.UnsupportedEncodingException;
    ( R- A0 c# T( L# D8 b/ bimport java.nio.ByteBuffer;
    1 X/ g% F8 C8 M1 ~
    % e1 _, Q9 @0 j7 L
    & Y2 E$ d( u1 ]( L1 M# H3 W
    public class Test {( V8 x' Q: J8 G* ^" n; k; f

    2 Z, H5 `* N2 r6 `5 u

    ) Z  P6 y% u! c- N* g+ u  |3 v        public static void main(String[] args) throws UnsupportedEncodingException {( ?0 ~/ G( }8 ^
                    String nickName = "得😩得得😩";0 E9 f0 a* P* ?8 y8 K
                    System.out.println(filterOffUtf8Mb4(nickName));
    % O2 s1 }) G% x3 m. y        }
    ! ?  X! X$ S0 E) t7 K6 p$ z- h8 p, l& h+ R2 E8 y

    ' S. M) |9 A* B+ J- s        public static String filterOffUtf8Mb4(String text)
    1 G7 W7 b: U; V4 _9 m6 S                        throws UnsupportedEncodingException {4 i1 P6 S/ }+ ]" x( A" g; n, U/ D7 x

    * q9 j( ~' U+ @2 y* g7 j# L1 c- t/ b

    4 t, d; G" k; }- k2 ^0 n3 z- x                byte[] bytes = text.getBytes("utf-8");, Y: P' }2 L8 z6 H: R. j8 ^8 r
    - }: V# `- G/ A  A
    1 U5 I- A# l1 k* B3 G
                    ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
    1 r' ]" c. O  e7 J7 z0 _: j- p9 W: y' o8 {* ^
    / ^% K: y! D( g* L' n/ Z
                    int i = 0;! M  q, J, C7 ^4 I/ ?# ~

    - @" ^! J# _! N3 o1 y

    + d5 l- v' m4 O4 H6 ]5 a6 ~- b                while (i < bytes.length) {6 O6 u9 |6 u; Q( l

    6 y7 x/ _: q. i7 Q* `, Y6 O. G9 G
    7 p6 ^" J+ y* m7 ~; F
                            short b = bytes;* I$ C2 M9 N" r$ Z+ F8 P

    ' {* U- y# A) q

    1 h* A' O, ?4 W6 U) a                        if (b > 0) {0 E* i9 V$ \$ D& ~1 Y
    , X2 j  P* Y4 v* |5 e0 @
    $ K7 }& Z6 Q6 r' w
                                    buffer.put(bytes[i++]);
    & m. g) e" A* f  z
    2 ~/ e" O6 Z& F0 u, `  t
      k: Q# G- I1 l8 y* U
                                    continue;
    % ~0 N% R' ^& x$ q- X- N2 v( X
    2 D) R8 P' [+ Y4 c

    : R( `( t3 b: u: z! _7 \$ j                        }4 Q, l9 p0 l0 ~" R, x7 ^' n+ \4 p
    . e2 [' l5 f! F4 }( o. _5 `

    + }, d& A! M1 Z' c                        b += 256;
    ; j& I* X6 _: X0 Q4 `/ s& v3 f* }7 J: V7 S

    1 s' ?8 T- |/ H4 l& n; K                        if ((b ^ 0xC0) >> 4 == 0) {
    6 Y% g6 B* O8 w; S, R: R0 s% ^1 O0 V  l' h1 ]3 h+ E

    3 b5 J+ }% X& C7 ]0 m- J                                buffer.put(bytes, i, 2);5 A: o) [7 b! d% C

    ( j7 T8 N2 A# X' d
    * C1 V' P$ m0 l+ J( s
                                    i += 2;: Q% I5 W( l9 g# g5 `/ j0 P# z

    : |9 Y% P1 `0 s0 C& C

    + f1 n/ _( C- g8 X( P0 O                        }# J3 L) r7 t# Z# |" i
    7 ], k: R; z3 B5 S6 O# y
    : ~# P) t/ r+ u7 }; h4 f
                            else if ((b ^ 0xE0) >> 4 == 0) {( t7 W" i5 t0 h2 u& |
    9 Q& Z0 k$ U- c$ a1 ^. S
    0 i( J3 c& c" P5 [7 f: B9 d
                                    buffer.put(bytes, i, 3);8 Y4 K5 a# Y+ k! |0 Y
    / _8 o5 n* Q% O0 J/ t. K

      |% L! l7 _( d' u; B/ v                                i += 3;
    + O7 f  ]& l8 [0 l* n; y5 @! j, `9 |2 k/ I7 S7 Y
    ( O- A7 v% p9 \6 }% B7 X* y, D
                            }4 o* n. p1 b0 B) K, `3 w0 d& ^- f; V

    ! b% I( R& k5 Z) }
    1 I5 z+ K$ G# B: A3 y
                            else if ((b ^ 0xF0) >> 4 == 0) {
    7 ]+ k* p0 b: d3 Q- d1 o. t( b! B* O1 J1 W$ V- d) n( E0 @6 O

    ) v8 @6 e4 a1 F. e, u; @                                i += 4;
    ' |" \' i2 N( l$ Z& X
    / G1 H% `$ U2 m' t. B$ |

    6 _9 ?& \) p# B2 X" O' P                        }  m# [4 x0 f3 l  ?- |
                            // 添加处理如b的指为-48等情况出现的死循环3 j  f3 a( Q$ P$ S1 B1 D! s1 B
                            else {* Y( x% l2 N9 h
                                    buffer.put(bytes[i++]);- `% f' g" `4 @$ q+ C. j8 Z  G, H

      z0 B; n& W7 p% a6 ^* b4 K
    # U2 P8 {5 S! k* Q5 P. j* m0 i" }
                                    continue;4 W! ?% k4 J+ z/ K
                            }
    3 g! K5 F5 [: [: q2 k
    8 G; v# d, T/ @

    5 Q. b4 k4 @4 t+ D( j                }" E  }/ C3 g3 j. q
    : ?4 ?3 y3 ]+ w2 N# B

    2 a; {* C! ]+ U2 x9 R2 ?                buffer.flip();
    0 f9 P' `" l6 N" x3 t
    , b% A! n, X4 T

    ' E" C" ]. m6 Z                return new String(buffer.array(), "utf-8");' r" s) g: L. Y- g  U8 k! Q& G
            }
    ! x+ B6 h" _- U: E) G" B  r  T- j. F$ G! y
    - N9 ^5 A! j& Y& {
    }1 Y4 |, i$ ^7 P( x2 \3 C
    + g$ Y7 x# i1 z$ }( z2 E4 p

    # k1 J5 D7 ^1 c7 A( q% z, [2 c. p
    回复

    使用道具 举报

  • 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-11-21 21:10 , Processed in 0.633798 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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