java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3870|回复: 1

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

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

    [LV.Master]出神入化

    2100

    主题

    3758

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66834

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

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

    3 E" S. X8 T% k

    * k3 l$ Z) }5 \/ V* {% o  N; I: jimport java.io.UnsupportedEncodingException;( b8 ?2 }0 t% ^1 {0 v
    import java.nio.ByteBuffer;! z7 g+ I. t/ f. F! O

    # p' k1 N! {7 r( a9 x

    * O4 b' P+ H1 }6 n2 Z- i7 |public class Test {: [0 e8 |6 W- U
    ( h, s/ m9 [5 p! d

    7 X7 S3 b$ ?# }6 k9 H        public static void main(String[] args) throws UnsupportedEncodingException {
    $ C% Q1 c/ T0 K3 |3 m                String nickName = "得😩得得😩";' g/ F6 F$ @, C1 O8 I0 J$ b
                    System.out.println(filterOffUtf8Mb4(nickName));
    # S4 }9 t* T/ `, C        }
    2 `( K6 H; O( Z. D
    . w, q  t+ `+ T! e

    " ^/ c) |9 ?6 E0 H3 V" e        public static String filterOffUtf8Mb4(String text)
    . z5 S3 e6 t, U                        throws UnsupportedEncodingException {5 x  C$ u+ U' v) ~0 c
    8 e+ ^+ D# `( u1 f& K% \# `

    % C# n: Z# q+ V1 U                byte[] bytes = text.getBytes("utf-8");
    0 g8 G, W+ {0 c6 k7 Q9 @/ k* s: L; ?0 c0 V; l+ V2 `/ g# k
    + a( h; p5 l. k2 H4 G
                    ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
    , K; r4 G. x' ~1 s+ T3 p% U% C, s% b5 `

    " U2 D7 R0 {2 D% W& [                int i = 0;
    0 i& V$ d+ g+ P* f7 ?1 y  y( c- T% Y# E; r; |$ \
    ! J6 ~, d0 N" e" A5 @
                    while (i < bytes.length) {
    + j2 j" Y1 J( k% a( G! Z+ E. [& n0 r' f$ `

    & L+ Q% o+ t! X5 F                        short b = bytes;
    & A# f! R' X; V/ _, Y7 j
    5 d- J. x) u* V  P$ m* M
    , _7 d0 G" O1 f8 B( [
                            if (b > 0) {/ C0 V! q" _  n/ _  E* o

    " @* A& u: I( I4 F  W" x$ `: n

    / P( W, c( r9 h' Y7 x' c                                buffer.put(bytes[i++]);
    8 F8 |0 {: C2 s* I6 u5 b
    3 v4 b% Z9 V& N, c: @

    ! l. I) r/ D4 {. c4 K- q5 [, w                                continue;
    ! d/ z* |& \  }8 y' w! s9 T6 h) S9 K& [; |4 l% R$ s
    : j1 T3 g; n( t4 \: W% g3 \
                            }- O5 t5 a- W% i% Z
    * L# e; q. X! r
    * O, s( p: r# r* H# m
                            b += 256;
    + A2 @0 o; l$ }/ f: C" z6 ]! H$ y' G+ z$ f
    & E  g& F: M; |. v" `' P
                            if ((b ^ 0xC0) >> 4 == 0) {2 Z9 e; a  [# n- C
    % J5 [9 C& W2 P( B" ?1 I6 t
    ! O4 H$ O* O# m, s1 D% d3 H  I" z
                                    buffer.put(bytes, i, 2);
    $ g5 n5 c& H: q2 m# ]: O' @" ^& B/ d4 S( J
    9 S- V$ \& ~0 a0 z
                                    i += 2;3 S* M- }: V' a' W. Z7 C5 I$ e
      e5 K# j2 |/ f% ~) b! C' B+ [
    0 k/ w% W! f0 u( R
                            }) }, W2 E3 V5 a% s, m

    ! |: d$ Z6 z' G) b" b6 `0 {& s6 J
    & f& X6 H( E' }  j
                            else if ((b ^ 0xE0) >> 4 == 0) {
    ; Z4 Y2 Q' Y) V; y, t
    , \3 m* i( g5 E

    ; @9 ]* t/ L6 Q2 Y7 b: q+ [7 M                                buffer.put(bytes, i, 3);
    $ c2 Z$ U! P- e  F+ R" H; |8 O  w) j" b" M8 S5 Z+ S
    6 F/ L: t+ C% a' a% F8 A, N
                                    i += 3;
    % B# ^  j9 }0 J, ?/ R3 g  e! A0 P- ?5 I( p. N# N$ z
    ) `3 c* |: x8 S" d" Z& Y- g
                            }
    3 u" @+ F1 M+ P" I9 E# b5 X! J4 a7 I' n
    7 B3 L) {  |0 D" C
                            else if ((b ^ 0xF0) >> 4 == 0) {1 \& C# g) X0 A' s7 t

    + m/ Z; @0 m6 d3 `3 j  p0 l7 k. `
    8 W- D) _4 {3 |( k$ N8 H) z
                                    i += 4;+ A  l3 M4 |: J, \4 U# [. u8 |4 i
    + i2 ?9 v1 a! o

    6 s: c) }9 U- _                        }2 Q. Y5 o' N  n' |2 Q6 Y( t
                            // 添加处理如b的指为-48等情况出现的死循环
    ( S1 y* u" t& ^8 w* _% T                        else {$ x# ^$ P7 `0 `# T: f
                                    buffer.put(bytes[i++]);$ ]# O" T2 B8 N8 w' Q
    ! Q% ]: Y7 s. H/ ~  A

    - D5 y1 |, W: _                                continue;
    , t8 h+ {8 x0 S. U# G  ^+ y+ X                        }
    1 n4 s% P8 ?$ V' T0 d) w
    5 V+ _/ x0 O$ Z- ^$ p

    / c1 H& J) E  c8 q4 }2 x% B" l: r) o                }6 U! `% t' h4 V+ z* J6 o1 |
    * |9 h' F8 ]; ]4 u1 R
    ; ~- @; z: S$ j- r" S0 ]
                    buffer.flip();
    ; N3 L* U& U, H2 J# @
    ; `+ s5 ]# P' m3 u) P3 _: n2 a" ]
    + u5 N+ ^( Q1 U
                    return new String(buffer.array(), "utf-8");% i5 \# u- Q; z) i$ n# v" m
            }0 [' }; ^8 M& M! x, [" P
    7 C* K/ n1 z4 \4 j& J$ u# }- D6 G3 X2 r
    , R& q7 S0 B! N, V9 o6 g
    }* `% M4 j9 R$ \* Y2 {
      L9 u% J" S' \- `) X
    $ c, T  N! [6 A. y; e' 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-4-21 08:15 , Processed in 0.884444 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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