java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3740|回复: 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论坛
    # p/ |, X% U. z% h
    , b5 o" X: I$ `) [0 D. O7 [, M

    7 M3 e7 s0 I1 _: e8 [import java.io.UnsupportedEncodingException;
    4 h- N/ y( V5 i! F' q6 O* ximport java.nio.ByteBuffer;1 _+ }$ I7 t5 {( D" T, t8 t

    " }( q8 N4 ^7 o1 a
    ' U- L: e7 k1 |: u$ l2 m
    public class Test {: a5 d; {" G  f$ d1 F
    & o# K" S. P9 r' ^6 m) e

    $ G9 p( H) e3 W        public static void main(String[] args) throws UnsupportedEncodingException {% B5 o2 |8 X) u6 {) w1 s
                    String nickName = "得😩得得😩";
    - R" L+ H$ P; ~! S$ L* |" l7 A$ L                System.out.println(filterOffUtf8Mb4(nickName));
    & t; ~3 Y, C1 }* U+ ?        }
    , I! d. G0 h) B& l+ F+ r# H( X1 @; i  z2 h! L5 o% E. J

    " q8 i3 L3 @& g: e5 a1 K5 R$ S        public static String filterOffUtf8Mb4(String text), ?0 p6 Z0 A( F8 s
                            throws UnsupportedEncodingException {
    0 G0 K' @& J! m' U1 U; {8 O
    " b4 y, U" d' K# t' ?

    9 Z2 d  \- ~! E' U! N. x                byte[] bytes = text.getBytes("utf-8");5 a; {" g, {3 [  j; S

    + G( k3 _, ~8 F0 N
    ' f8 q( _# p+ _4 g& Q
                    ByteBuffer buffer = ByteBuffer.allocate(bytes.length);2 y! }! ]2 Q8 t* @3 P

    6 ~; s' A- U* r- O9 p" [
    6 L; D2 K) K  o" |
                    int i = 0;
    3 ]  [& O2 n0 X1 M) a, v/ K
    # ?/ s" Y/ @( ~; z
    7 h2 e1 i% o- X4 t8 \/ s
                    while (i < bytes.length) {  M  P% E  o8 i4 u* M! U. U
    6 p) M9 A$ Z0 I6 s  X
    + q2 ]% \. R! Y+ B1 f4 }' R
                            short b = bytes;
    6 m* s- K+ a2 b& o/ ?: }! U% M9 u% }. {

    / }) K3 J* ?$ `$ u0 a                        if (b > 0) {* C( r, Y0 M6 g  E8 h1 \

    6 {' ^& i5 y) H+ i* T* I+ U! l

      c! S6 u# [& N: O: g, R                                buffer.put(bytes[i++]);
    ' z! z- L) @- [+ r; T2 `
    6 H) S) ?) }! S  d6 k9 k

    % s8 A# z6 m' r( S$ k                                continue;; W( ?- z9 G# b0 F7 p

    7 ]$ s7 w9 {! ~# A% m3 }) ]8 ^7 y

    % t' D9 L) O  i8 I) s                        }
    # g1 h: `& d5 x+ L) i  r
    2 G/ F+ p  N# c4 P4 e

    4 y3 p4 ?; a0 W. }4 h. L* v# j                        b += 256;
    . ]9 N. V& c* i7 x; |; z7 X6 t9 w2 K# Y& M1 Q+ n5 b

    & W& _( g3 K9 H# _# n+ {# s                        if ((b ^ 0xC0) >> 4 == 0) {
    % n. z6 v4 v3 n, B1 N
      t6 n! \0 J( L8 C1 ]2 E0 |

    ; \; N& V- j9 N% r( v. u  ]                                buffer.put(bytes, i, 2);) W) Q. W# p8 w6 o8 q

    3 j! z5 R5 X% y& p7 K
    8 N- I  q+ W! t0 C
                                    i += 2;
    # R+ D* b5 c0 Y* \/ ~2 @  |2 A( x$ L0 P; Q- K

    0 |( K. z& v) O9 Y                        }4 U0 p# k, v$ c! |

      A. k2 K) H' q; p1 u8 Z

    % ?+ W& [# e9 T! d- R" f5 m4 }5 R                        else if ((b ^ 0xE0) >> 4 == 0) {
    7 V9 W3 A3 R! J! u
    ) w. u2 b$ d0 G- R/ Q/ Q: C
    7 ]7 L. N* }. m' w5 u5 ~
                                    buffer.put(bytes, i, 3);
    % l" R* Q! ~8 `) f4 R/ Q4 Q' z5 v8 O, {3 `0 \  e: f
    % k& Z, f  X1 \* X) Z, f: e* M1 Y
                                    i += 3;' Y7 \8 a  y! c7 d

    3 A) P- I! V; |/ V, n5 s; R# \
    & n. I4 I: T" D
                            }
    6 I( C- m( u% p8 Z5 A: x; G$ t
    3 _! l. c8 Y$ m: [$ P
    , w2 I5 N6 k) K( u6 G8 y/ C% O$ D2 Y
                            else if ((b ^ 0xF0) >> 4 == 0) {
    - U( C7 v& x# r4 A6 q4 }& U! R
    / g" z* Z9 \! o. p: B6 x
    ' g' W% X. D! O* S
                                    i += 4;+ Y; j+ X. V1 V/ `7 J

    9 p+ T; C, ~# s- c7 F4 p/ J
    / S* m6 m/ U: ]& ~1 R- b! M
                            }& q% b; {4 P; @# u% K
                            // 添加处理如b的指为-48等情况出现的死循环; h4 c) f& z4 U7 L! T$ F1 I
                            else {
    , w2 [7 t5 m  [" Z6 A6 I                                buffer.put(bytes[i++]);2 v! f( m6 ^6 ?, Z9 k
    ( M" x4 E0 r" |
    9 h. [+ S* Q& B( p
                                    continue;
    , Q' S" Q* d6 C; m6 Y7 Q; |                        }
    4 ?$ {: r7 y* a$ I# r+ {2 B+ m9 {: }, M% t+ i

    8 K- B' z9 J# ]  m- i4 m                }
    / c5 T+ p; Y  `( F9 n1 `$ {$ h$ y: Z7 i8 X) u2 R  {
    ( c& C' o- z+ }8 f  `! S
                    buffer.flip();+ Z# A+ M3 b& e

    % T. w  U9 X: w& @8 }2 s

    ; u! G- _) Z" W( B8 ~                return new String(buffer.array(), "utf-8");& M5 W2 F: k2 t. N# r
            }
    & q8 ?. s: t8 G) ]+ A% @
    ( H% c6 D/ O& q# H6 C. I

    4 g4 L& ?0 T  n8 n! w}! u3 L, w+ R6 T" ^. e# }" ~
    : I, A- }7 d  `8 ~
    1 |' c# X# h- r1 Z% o7 f, a- L9 j
    回复

    使用道具 举报

  • 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-23 16:15 , Processed in 0.252431 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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