java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3599|回复: 1

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66105

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

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

    ! I9 U% m2 V6 @' Bimport java.io.UnsupportedEncodingException;; P- d; D: z1 ]5 p5 w: o- x
    import java.nio.ByteBuffer;. r2 f) w) r( r' z! E2 l

    2 F7 i  W  K( u' a6 z9 k4 z: T

    ! S9 D( N5 g* ?! G1 R; Upublic class Test {
    & `- L$ Z3 r8 C( h% {
    6 K9 O' J, L) @  O5 m
    , p5 a, _$ R% \3 }
            public static void main(String[] args) throws UnsupportedEncodingException {* X7 C) U1 b2 G% w- P0 n8 i
                    String nickName = "得😩得得😩";$ o6 y  F& v) G$ b' Y
                    System.out.println(filterOffUtf8Mb4(nickName));
    $ X6 S3 w% n9 t5 {        }
    - Z# t) w! c9 y+ E' H
    - g5 n* A) k" S

    7 i$ O# J. y$ B! ]# h; w        public static String filterOffUtf8Mb4(String text)
    & u' L( Q) i) V3 q                        throws UnsupportedEncodingException {
    . {2 S" `9 ?4 i: b8 x; K2 e9 X- m0 M  a! [

    2 U* M8 {3 P: e8 X6 O                byte[] bytes = text.getBytes("utf-8");
    3 b4 F4 c+ o9 b; R, O) z' K6 |) Q( O: A; x  P1 S& j# R
    ' R( [; B  H7 G9 c6 q- W5 V
                    ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
    , L9 a5 L& R4 [2 h3 k: g3 S
    7 U( U% O8 ~# @+ J
    - w& q! T9 m( B0 J" z" o
                    int i = 0;2 C  n* [- ?7 m& ]& }1 ?$ C) S5 c

    # N2 z1 T: y; m1 O" Y7 `
    , ]: A* Y& }" K0 P4 P0 b& T; o
                    while (i < bytes.length) {
    . n5 s3 @; P8 G" z! c- p
    ! g2 E. }/ L  Q
    8 N5 r$ h, W) a5 p9 E8 c: ~0 ~
                            short b = bytes;0 h6 [: M+ ?) s- R& j

    2 ]8 r5 h% k- E* g4 d% D5 t1 r
    6 A/ ]; ~/ g7 b0 F
                            if (b > 0) {4 B- K8 J! `0 U) |) O

    + L" E7 `# E. ]: a3 t* x+ `) |

    " ^! {& N( [! H                                buffer.put(bytes[i++]);
    ! L. N# y. |1 }  \2 X( i/ K8 V1 b. j9 ]/ {1 C, o  H
    . Y: r& u; _5 G
                                    continue;
    1 E$ P1 {8 |- Q: y7 u. a9 f0 C( X

    3 f0 v7 k) q/ F                        }! N! Q; h* b% A1 \# ?4 ~# M
    : ~+ P3 Q: f; }0 j& |+ J( R3 A
    9 ]: K5 M5 _) z6 o! N6 i! J7 b* s/ o* X
                            b += 256;
    7 P: x# j( j; {3 A. j; z; M  w# D" ]' `' ?3 O* r
    , I# \' _% k7 Q3 A+ }+ G- h
                            if ((b ^ 0xC0) >> 4 == 0) {( M' J  B: C- C3 ^4 e3 C
    * Y7 ?" S+ Z9 x
    9 i2 ], u& d  c$ K2 h
                                    buffer.put(bytes, i, 2);  `% W# X& x# K2 g
    $ F4 Z; s$ o# N6 q' z1 T: H
    & l& O7 g, q3 K* o' U
                                    i += 2;* i1 u$ j/ P( O- Q( ?4 Q* @. z

    / k2 b. q: j+ h- c" c( c& J

    : c: r3 i/ W- p  A( D( w+ r& u$ e/ O                        }& d7 f5 M) [+ i1 j% V: {5 W

    ( @- T$ O( ^9 ~( x0 c* x8 [
    . g3 r8 Q4 p, s6 T$ W  A2 Q; l; Q1 ?& S
                            else if ((b ^ 0xE0) >> 4 == 0) {
    & s; v* d" w' z
    ' t! U- u( i# q. @4 v8 J

    ) y  C8 U) R; b( M9 r                                buffer.put(bytes, i, 3);
    . J1 N& G# q+ E4 p+ U; o. {0 p6 m# x) z4 s: C* E- \

    / w8 `4 V% V' m6 Q& Z% A1 t- g( j                                i += 3;
      l( B' V9 m9 E& j; _& h+ _$ s$ g4 h! X* e2 e0 W/ D8 [5 w, h
    4 ]1 N$ x9 A; G- e/ L" f
                            }
    , {9 y/ F3 j+ g& o5 B1 ], v, ~; {: U8 D  y
    0 [, {" {9 M! p/ h6 b6 M3 p
                            else if ((b ^ 0xF0) >> 4 == 0) {6 @7 z) r1 j6 }9 G* f( u7 p$ N: {1 }
    / B3 _. i& y; O4 v: G  T8 n0 G

    ! J, a- V4 D' b7 n; X7 F                                i += 4;% a0 v1 Q7 m& u/ v& v
    9 Z2 ]7 o; b, |/ M

    ( h- t# ]$ W. @  e* _. a' z                        }( I/ t$ `8 T' ?
                            // 添加处理如b的指为-48等情况出现的死循环$ U' c/ i+ f6 {. Z
                            else {
    1 x" U- S& C+ r& \& c7 u5 x$ {' N% `1 R                                buffer.put(bytes[i++]);! b4 b7 F7 ~; Y) Z; m1 H4 D
    ; `% D- C- ^( K# c* X
    0 J9 E( E7 `0 d
                                    continue;1 s6 \( }9 O. }. c( [0 p
                            }
    : Q6 L4 J5 Z$ p/ D
    / T0 q7 @# m6 \% @

    3 K# S% u* }1 `9 Y                }
    1 _& v, Z5 `; p0 K( F7 ]7 _) `. e  u; F  _* l# d" k* y1 ~
    , V$ {0 ]* m; j
                    buffer.flip();
    4 s# Q8 c8 i/ H
    # {* ?/ \6 `  M' z* t$ \& @" ?
    ; V' p: D0 _$ l- Z: _& ~
                    return new String(buffer.array(), "utf-8");5 ?/ O9 ~6 E/ s# [8 i
            }" q. \4 y, l, e8 U9 W7 Z; q
    - v- l# K$ H0 H: a1 [( x

    - x8 _  V7 W6 l8 z1 @/ B, M8 G}
    # p) c/ }7 A6 ^' U  S3 l
    7 b: D  h2 d" Z/ Q/ d
    + R/ \. e5 Y9 P0 n
    回复

    使用道具 举报

  • 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-5-7 04:12 , Processed in 0.067078 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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