java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3828|回复: 1

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

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

    [LV.Master]出神入化

    2062

    主题

    3720

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66592

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

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

    - U+ M0 U8 r7 H/ D1 _
    * l7 J; n* g( W' f  U$ ^
    import java.io.UnsupportedEncodingException;! r7 }4 u3 i* @3 t
    import java.nio.ByteBuffer;) _7 |  b( c/ V! q" \$ r7 C

    $ S! O# p9 U6 t$ |  r
    / ^" L# E1 k! K- L7 J! V
    public class Test {2 U- F: w1 X, J

    $ h9 v+ D# H8 j" H) @

    & u/ i' x! W& r8 O        public static void main(String[] args) throws UnsupportedEncodingException {
    " G# T) k, R& B) G                String nickName = "得😩得得😩";/ u; \4 v1 ]' W3 j
                    System.out.println(filterOffUtf8Mb4(nickName));, u5 U; J$ B; o. j6 a/ w: U
            }
    3 u, |" G; L7 o" ^7 W  P) L& n) m4 P' c  \

    & d* K: e* Q- r5 e1 D        public static String filterOffUtf8Mb4(String text)+ |, l/ h1 [7 Y! q
                            throws UnsupportedEncodingException {
    1 V: w$ W$ J; t4 M
    1 U1 @) M; v  k& r0 C

    9 \$ Y7 B( l* c& i% Z! A, S                byte[] bytes = text.getBytes("utf-8");- Q, w5 l. R2 y7 A& z8 W' `6 B# s
    : h, n! [, A  Z. K- \( A4 U

    " c! E+ F- H; q% h- W                ByteBuffer buffer = ByteBuffer.allocate(bytes.length);4 c$ }* w/ R1 Y5 i5 m4 c

    . G6 I2 X* G) o, T" o) K+ J
    , P! i, B9 w) l2 k+ z5 H# F" ~: N
                    int i = 0;
    * e1 ^7 s- o; \6 W6 {- [: b2 i7 g& Z# s+ h3 R
    $ A6 ~; m; z3 t' ]- }0 K
                    while (i < bytes.length) {. H8 c' q  r9 S$ n" c3 r

    / v& F% m# c6 w- i2 M& z

    ! v) m8 v6 f1 d2 a) v5 ^                        short b = bytes;
    * A; s: h! d' ?0 _$ r! b
    1 U- O2 F' P8 h6 k. Z4 `2 M* k

    . e4 g6 ~+ L/ q) O: l1 ?                        if (b > 0) {
    . E5 v  k9 w8 L0 b( o
    1 X# B; A9 D  L- x) [

      Z. ~0 l0 G$ o, u                                buffer.put(bytes[i++]);
    ; S/ E# B$ l; H" \; X* i1 |: b* P/ w7 @8 D& M- A
    & @2 ^+ }) U. ?! A
                                    continue;
    2 X  {, V! E8 X/ }' x- U+ A/ s' j, e3 ~5 T9 s: T# t8 }& S. W
    3 ]6 A; ?  c$ Y  a
                            }
    8 \' q0 ?0 U, ?1 a) W$ _
      n4 e- f' z1 Z. G* |% w  M

    # G; ^6 G4 H) ?8 n; S                        b += 256;
    * [' }/ v( ~0 @! j( X3 l$ J5 V# I0 m$ y* V

    3 `0 N+ E( h8 G, @7 d6 j( D8 C, o                        if ((b ^ 0xC0) >> 4 == 0) {
    7 `2 e* @( Z# J. q+ A$ K4 t) j2 `3 O0 V  `2 [$ n

    6 [" `* p8 l. v* Q) k9 H                                buffer.put(bytes, i, 2);/ F% \. I; V/ k& L

      f* ]* \8 b9 p1 ]4 o
    8 }! Y; e& ~/ H% L. k
                                    i += 2;
    1 ~# n# o- C& z" A% P1 Q! `6 b6 j# c0 n1 }& \

    + b7 ^4 l# e! ?( j                        }* p+ G' k, J4 B2 h- I) L9 V6 p& E

    4 k0 s0 z: e  C) E( {8 y$ [
    ; S: v% [) l. [! g  O, ]- J. Z1 Z
                            else if ((b ^ 0xE0) >> 4 == 0) {
      @4 ?, Z7 a2 b+ Y# I; x. F) V( ?1 x$ p$ e6 ?6 ~, S8 H2 R# n9 ?

    % i2 c/ a4 j' {% `/ t                                buffer.put(bytes, i, 3);* i% Y. E$ R8 \

    1 x- p) J: x5 Q  f! }
    ( [: f- l3 q- v% C/ Z
                                    i += 3;
    " k2 d/ }" z0 Q
    3 |" s, w/ C% y. z' m

    2 r/ n3 Y$ v8 k! `                        }
    6 f  ~9 a/ _7 U" h# J# T& E8 g- P+ b/ k. I1 S

    0 F' |* y$ g6 X7 K7 V$ H                        else if ((b ^ 0xF0) >> 4 == 0) {
    4 m- _' Q' G  s& Q/ `* Y2 V: t4 C( t, k$ j; Q
    ( \) ~- s# I+ r. @4 Z# l
                                    i += 4;) K- Y  {8 R; V( ]* w
    . ]1 B2 ]+ l* N% ?" V0 n

    ( }9 a* ]" N; E0 n$ [9 r                        }5 w" U% H) @* l, p6 W7 e
                            // 添加处理如b的指为-48等情况出现的死循环3 E+ T. ]9 B" q* t# G
                            else {
    - E: Z  T! P. r( E                                buffer.put(bytes[i++]);) K# ]9 f8 o1 _% I# k2 z! S
    5 l$ ]. q) H1 D1 P& p' u0 N

    / t" P4 v* K2 H# S                                continue;! b8 @; G: H) L: k' N/ y. L
                            }+ h/ C) l$ P  M) H

    ; G  J1 M9 }0 P0 V8 r
    $ i& J' b, X# d7 }% I, ]8 I' v, P% g: F
                    }
    8 P- |/ m; s2 F( ?3 u" L; ~8 X. \* B  S5 N
    6 G$ @) K$ Y1 I2 ]4 ^! T
                    buffer.flip();) L. }4 X) k0 g: P2 ^

    / ?( f8 l- q9 S7 U1 f1 w

    5 ^2 B, _, M& D5 o" d6 B( [% [                return new String(buffer.array(), "utf-8");
    5 m; J& j) h2 K" `3 m        }
    ) @6 u7 \" F8 \; P: Z: |' D, D. _2 u% v5 i2 ?3 [
    1 s8 I3 @! N8 f* t# A. ?7 y% ^6 l+ ^
    }
    # s6 [8 D$ P3 l5 |1 ?% n- C6 ]7 S- z
    $ v5 W  g% ?2 q. {, i
    回复

    使用道具 举报

  • 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-2-23 11:44 , Processed in 0.637569 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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