import java.io.UnsupportedEncodingException;9 S S5 c2 W8 `" H* O w1 S% _1 M! Y
import java.nio.ByteBuffer;5 p5 Y1 V+ l) u% f
, O8 H0 u- J. C
: i6 m3 Y! Y/ _1 k. apublic class Test {& i0 b- x1 n1 d* o
9 t3 r$ r' S: ^9 C2 L
$ c% D- D8 [8 U! K: B7 T2 o! Ypublic static void main(String[] args) throws UnsupportedEncodingException {0 k! S$ ]) L$ y2 b2 R4 j
String nickName = "得😩得得😩";* N. |0 S: N* \* ?" o
System.out.println(filterOffUtf8Mb4(nickName));
& S+ A3 d+ F. K}( w2 e `2 w: ]' A6 H [
% K! i. Z0 B& ^( f
: ~+ F I$ Z2 ~9 p( V" y6 f. X8 h! wpublic static String filterOffUtf8Mb4(String text)
W& L/ d& R$ e+ g G7 Jthrows UnsupportedEncodingException {( v1 S( z2 W# r/ J
" h2 G2 u3 V7 F0 u2 I' d7 q4 s. S% S6 b3 a% ]
byte[] bytes = text.getBytes("utf-8");
+ O$ c5 g9 Q# a1 i" Q, _! ^; f4 h" v8 \1 ^* g+ ~4 A% w
5 Y8 P! x2 F) z2 }" L) YByteBuffer buffer = ByteBuffer.allocate(bytes.length);
/ Z7 |5 C/ l" T+ q" \% a* R, ]+ }5 Z$ m+ \; O7 D: `# a! {; E. L/ C: Z5 ~% O: Q* ^) w# Q3 _
int i = 0;
9 v3 U2 P( n; G' \/ ?* ~) c* v% p1 ?6 o* }* D6 i, A& @) ~9 u% K) c( p+ J# I
while (i < bytes.length) {
+ C3 Z7 @7 _- ~* o: k2 c' E1 O+ g- s" }3 A5 L* C) o* }
3 j$ x: F4 c- _' z+ L! D# R$ z2 }short b = bytes;+ I6 i( T% T2 N8 f( Y
% O; |! M5 q3 G0 A* i0 [% n
* j* R. A, q5 eif (b > 0) {
& g' m/ i) D$ j6 O; h7 z( A2 L) o/ L. w2 S- {# U, `. x% u3 G, w" J3 ], Y
buffer.put(bytes[i++]);+ e' ] U! J7 k' v+ e: T8 G. K
9 z5 X, \' ?8 p' n) ~, J7 p
0 ?" C. j1 D" P( \- L+ O& ncontinue;* d5 F) S( J( S$ X% b
6 t; O3 A: `" R& j. A, p# l
( W! A' j9 L% `0 X& x. B Q}
3 x, R4 L) q; S% b: u. R2 j& [' R6 i: h) D3 [& Q7 F7 j# L0 Q8 @3 V
b += 256;
e8 N3 Y$ \/ Q$ ^0 N2 w% h( E! ^# b2 p# V, s- ^) |2 {; l" }. Q0 v* A9 {
if ((b ^ 0xC0) >> 4 == 0) {9 G" U# c- s/ A. W* [
$ L' u1 g! O$ i% x9 R$ e( o9 I
buffer.put(bytes, i, 2);1 b5 x1 f, F5 `
/ I6 c# i4 f. R! W( C: L- [8 m
7 `9 `9 m# D6 E1 Z0 X; z& Li += 2;
& d, M3 X" R2 K. g9 p( v. `7 k: P( v( L0 k P6 H9 i6 m
U) A- s4 X: W: l}7 N6 }) |* E( C6 D. W# F
6 l2 ?- F: z7 B/ Z
# Z' }( {) @1 v- @5 r/ L' E) S$ eelse if ((b ^ 0xE0) >> 4 == 0) {) `. S2 o" _$ `8 u- g- C
: c( x% b0 J7 H/ S9 |- ]2 J# ]/ Q1 B5 B
- Q) f( p, y+ bbuffer.put(bytes, i, 3);8 x* Q% i) o7 D A$ e4 k
5 j. L9 |8 P3 e6 ^" _! z3 k5 {2 n
5 r# B# ?' S' M3 r- d3 ki += 3;
* J( y) p; d) {/ |- k8 F k0 A% |6 _) O( r
" y3 G5 K) b4 ^8 N}' V# g2 O! }* ?
0 m$ Q r! H$ B! U9 D) ?
7 ?2 O0 N" z" q, _, Oelse if ((b ^ 0xF0) >> 4 == 0) {
" O# `$ `9 Z, i% b7 o8 d1 v: i/ M( [
- D. D0 D5 u9 J( V4 Ni += 4;
2 R& b& |, ]8 h0 Y. W6 q; p- t' e) i. u6 @' F) p9 x3 y9 ~% |8 {8 v& `
}
! {% \& Q5 r8 Y9 ~- r8 P; }3 [// 添加处理如b的指为-48等情况出现的死循环
' P0 n% K$ ?7 ^0 S) |else {! z; K( Z G+ c7 u# }
buffer.put(bytes[i++]);6 ?( r+ o$ L3 M0 _3 H M5 n5 V
' a) J) i6 I) y( L: d+ g3 [" w( _! c. c* r
continue;
' e' M. a/ A3 S0 T}
* M- x+ Q0 @) ~* S$ u4 o9 k/ z0 \( h- ^
' t1 E6 J. L3 R9 D0 r* Y! D}
9 {% S' I0 I8 W2 l M7 s9 v( ?- E: ]! a4 u$ T$ }7 k2 R. C" g) b. y7 k4 F( |8 @2 s- Z. I$ j
buffer.flip();
3 G% v$ c4 B( C, l9 {1 O! y, f+ \, c6 V
# i( K0 h: \3 y2 Y( Ireturn new String(buffer.array(), "utf-8");9 H5 k2 N& ?! `: E
}6 p( I7 E8 d7 z$ s s& ^
8 w, w2 U5 f) X% k5 d
4 I0 H9 s* b& r. |- I+ l" t}
9 ~# `+ b: S3 g( H
# t) m* e$ ]& a# R" U