java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3601|回复: 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论坛/ N  ]5 t, }& S3 d2 e
    7 ], A" g( Q8 S! f; `/ a; i

    2 x* O5 E0 i: J# A8 V  Bimport java.io.UnsupportedEncodingException;7 R5 q3 [: T1 g& V/ ?# y
    import java.nio.ByteBuffer;' l9 n3 X' Q/ p0 f; Z

    : n- Q$ q! t) o) ^& w6 C, w
    $ T: w  K7 [, r1 y. {0 N" H+ s# O
    public class Test {
    : ~( \# J0 c6 G3 r9 E* H7 N$ p+ ]4 p9 f" V, t- M% O& q

    6 j0 {' c+ b* f. w9 e        public static void main(String[] args) throws UnsupportedEncodingException {. O( M: x9 W9 N1 R* U% O  i2 H
                    String nickName = "得😩得得😩";3 p4 L; g$ M# @$ `% {
                    System.out.println(filterOffUtf8Mb4(nickName));
    2 {/ z) _+ m2 o8 S( e, O9 p        }6 d4 s- q- `+ _/ i; B

    ' k6 M0 x0 {; X4 {4 j! v; _

    - V3 F8 n2 |  H4 E        public static String filterOffUtf8Mb4(String text)
    & R% }* d9 c6 L2 V0 J                        throws UnsupportedEncodingException {5 K* {$ r  d9 P" o$ z+ O
    1 ?4 T) G5 H6 M5 z: @* F

    % x9 p3 E1 U2 r! v: d7 d0 |                byte[] bytes = text.getBytes("utf-8");
    ( d" _$ e" e3 q$ Q" E2 N0 {& I9 ^% r, Y" ]- M" v8 u  l$ X

    , B* ~3 ]6 J# H7 ^& J" }5 u4 J                ByteBuffer buffer = ByteBuffer.allocate(bytes.length);. _( |# k3 W6 X  I/ X

    7 f* K( D# v# L0 S
    * X9 z1 ]! m; G' I
                    int i = 0;
    $ r# `: }1 H9 N/ p  C1 N) Y) v3 P7 Y

    + }! g; C- I  l9 p8 }  d                while (i < bytes.length) {
    ! _. D; C: J9 |9 S/ g- ?. A6 w/ R5 j# K" z& }" f$ }7 I. f

    * g8 |& a$ D7 E5 d# y1 f                        short b = bytes;5 R/ f: V3 |2 Q  F

    ! E1 @1 f+ V: ^0 n! `' O

    & b; D) d0 N, S  b: U                        if (b > 0) {
    ! \/ q  f' _: `& w
    % K6 i! k7 ?7 k9 l) `
      I/ E' s! H: f$ A" H
                                    buffer.put(bytes[i++]);: {4 x4 U7 D, f2 K- y3 J; c4 R0 F
    * |& O0 \. R: K/ Q& B- k
    * T3 ]! d- Z6 W9 a
                                    continue;0 G) R/ I5 A, [, C1 R! ]( ~9 k

    ( @% k1 r! F. q

    ; ]- t# H3 R& S4 y                        }
    : `% w: ^4 r/ j" N  V
    - P  q  }) z3 ~

    7 X3 S- F4 i, v/ h  h! s' {, S                        b += 256;# X9 `0 A4 M9 ~0 @. S9 E

    9 k  g, x( G. [1 o: t: o) ]

    1 J1 I6 i, W* c                        if ((b ^ 0xC0) >> 4 == 0) {& C+ ^3 ]9 E' z: a% D1 Y6 A" x

    * L  H8 S8 }! ]2 S$ W  h

    - m& I' `' v# o, ]                                buffer.put(bytes, i, 2);
    3 y6 H8 D# Z* ]7 ?) y
    9 w. h. U  k5 D2 p( W! `' S

    - z4 }. m: g* V9 ]' }5 T2 k                                i += 2;% `- G$ Q7 G3 h' }9 v( b

    % h, v7 }+ ?: H8 e% e

    3 _0 ^4 e' D6 {1 V6 h% p9 a                        }
    3 [5 P$ c  U, M5 O6 e( |" C9 `; \/ L
    1 K+ O6 a8 L+ A" _) h2 B) f5 w7 L

    " x2 a5 c$ T( C4 f2 d                        else if ((b ^ 0xE0) >> 4 == 0) {
    , i# Z# m1 A4 k% g3 V& M! `: D) R

    ! d. u5 f: p. ~/ X; g                                buffer.put(bytes, i, 3);
    8 ~+ J/ G3 g% p4 y, B  ~/ J3 H3 s
    4 Q* P# b0 E. b) B2 D

    0 C" @) c9 x- J" |6 b- g                                i += 3;, V- z- Z2 F1 z5 K  z- e

    ; c% [+ W1 Z( h8 E- c! X

    ! V* x1 V- r6 z* K5 v                        }
    : n- y4 E0 u6 p; W9 c5 C9 F
    # F1 o# b  u5 S* e5 A
    2 G; a/ N0 b+ d& p9 E% [
                            else if ((b ^ 0xF0) >> 4 == 0) {" t7 L- J( A2 w# U( N; h% Q) C, @
    6 R% f; Z9 ]5 y+ z5 ^8 g# B

    # h7 H  F2 A% y; P$ q                                i += 4;# M* j& E9 l, Z2 Z

    $ Q  e' B/ k1 W

      d6 n5 l$ x+ b$ G/ M% L. T, D                        }- }4 ^7 i: C7 o
                            // 添加处理如b的指为-48等情况出现的死循环
    1 I6 F6 V$ G# A7 O: D" F                        else {
    ' e: J9 d& |" M8 |                                buffer.put(bytes[i++]);
    5 M" c* B7 S- j8 ^& ~# w/ }# V
    1 x& Y. \9 s5 ?0 E1 `4 m# O& ]2 w

    . W) b' y& J% k2 o$ {                                continue;8 t0 o0 P9 O  c& ^# ~
                            }
    / W; L) m8 P! t& l# \9 a% W
    % ]( m9 m% o8 K% m
    5 m- G+ E. b0 b  y8 o" V
                    }
    2 b8 q# r4 B. k9 G$ C) Y" R7 D
    ; N: _& a, ?" ^& \/ W; J
                    buffer.flip();0 A  C& f& d6 l

    % M2 ^6 D$ d2 ]8 L5 H6 ]6 A

    ; I8 L& c, t9 d  E' s* u                return new String(buffer.array(), "utf-8");# e, o) m/ L, H  [" A  E
            }
    7 n# U+ |$ P. Y4 j1 R* {
    $ j2 R, u/ B! D0 a' y
    7 c$ Z9 G% X9 D5 @- z% V: W
    }
    3 F7 H  V% t& F" U& ~' }# P  i" a, f) _* g5 v$ |8 [
    : P% I" W4 G. c* n9 |" j2 l
    回复

    使用道具 举报

  • 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 06:48 , Processed in 0.093749 second(s), 31 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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