|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛
. T# ^* s5 J* t+ d& K
$ u' s+ c, Z- c" k
' u0 E! T5 @9 E1 nimport java.io.UnsupportedEncodingException;& W0 h: a# N& l& T+ k+ a
import java.nio.ByteBuffer;
, n* U1 c+ p2 b" j+ t+ x3 `* R3 p# B/ C9 y
1 [9 O# R4 q! S& l
public class Test {0 ]; ]1 `6 C+ W$ i H# U. K
% E) Z- ^; N0 @) j
3 a, k! b3 y- W. _% g" E
public static void main(String[] args) throws UnsupportedEncodingException {7 X' j# ^4 r' ~5 I7 G! A. m/ i
String nickName = "得😩得得😩";
9 H7 o: ]3 T3 Q- k% W System.out.println(filterOffUtf8Mb4(nickName));
# C! L" s" n2 t" e }1 N3 r; b/ h0 a# }. `' G
/ k- m) F8 ~7 P# R* y9 N0 i! L8 Q( m
& G' Q8 s: w' I0 @% X0 [: z public static String filterOffUtf8Mb4(String text)9 N) E3 F; c7 g8 q$ [
throws UnsupportedEncodingException {
! d) {1 r4 C& k, X1 U& l/ E; M/ L6 S9 w& R8 L% c9 Z0 V: I
F! H6 J& D4 V) X2 [! V byte[] bytes = text.getBytes("utf-8");
# H! z) G- F) {8 t: m7 ^; K! d
7 _) x- J7 x: l, n' `! f
9 G% }3 i- |: E( J$ Y1 M ByteBuffer buffer = ByteBuffer.allocate(bytes.length);- r+ ^$ j3 \1 D- P+ R
# M# Y6 P" L8 ~+ k7 E/ Y0 M
% c' x% E" [; m c9 N1 r
int i = 0;
N+ v- h3 ^8 C1 h, C2 M. ]. C+ k; Q1 k8 X
+ ~# _- K: l+ q [
while (i < bytes.length) {! f4 K! M. C$ C& O' S+ X+ k0 X
/ r( ]4 n- k ?2 g2 v O, I" O0 C3 }6 V% r. h! Y- f
short b = bytes;! D, ]6 I$ F! o$ @# B# {
- O( H0 @! O* h3 W4 I: _3 S3 k
+ O% d9 V5 b( o
if (b > 0) {
: i! H# _; i! p6 k t$ A- R+ V' }0 c# N# L7 j) Z8 l3 m/ a4 `
0 K/ y, u/ Y8 i1 t( r
buffer.put(bytes[i++]);/ y! s) B" Q' H0 @) B( V" P7 L w. U
2 u3 b1 Q$ _& J# H6 j) g) G0 {% T! X- A
continue;
D1 c+ L" R% A& v2 u4 F# X: m/ z' l3 V
- o+ E" i2 F- e/ S$ K- J! o' S! |# |) A7 C; S
}
! Z4 E* x2 V( h$ p' C8 R b& g9 l. B) `( _& Y2 ^# e
- o- B" k3 d+ x. X- ?5 i b += 256;
; t$ B! a2 D' w
; C$ W& e: Y. M% w* m) ?, q0 b% ?$ V9 X
if ((b ^ 0xC0) >> 4 == 0) {
7 \+ C7 H: L# z% b* \2 R( A, t# z- i( T9 C
B4 S! L" r9 A
buffer.put(bytes, i, 2);+ e! K$ |4 j8 F7 j, s9 X
2 P4 o6 h& f7 S1 t7 T
5 q. R* p2 k- _8 r$ q6 O
i += 2;
, E6 e# [% j+ B3 |% Q
% l. O, Y2 L i" i, g8 K& V( y- F. m0 M+ I5 o
}
" H( V8 f# l3 K4 }$ c4 _, P3 o6 n
/ g; M% t4 ^* ?$ |6 w* \
: P) w0 K/ F! F: y8 z else if ((b ^ 0xE0) >> 4 == 0) {
) I+ ^0 H/ A7 f1 u' ?4 K D) K$ g$ C0 ?0 e u% w
% R. B0 R7 U; j5 G% G9 c
buffer.put(bytes, i, 3);
3 x9 X, l+ w7 N# V# ]3 q1 ^) k
9 W4 l: p% p! r* @
i += 3;
) p) o3 _7 q% u+ Q0 _$ f- [6 c: e% S: t
% O8 b. x* H# U }, { z# {* q0 k% m" J; [
' r6 q. B+ Q" K3 n
7 I$ o1 y( S9 n( u
else if ((b ^ 0xF0) >> 4 == 0) {
& e- u# }: V) z/ Y9 r) b+ i" v) }6 M2 j7 |9 I) i \4 X( E
L- H; n/ p3 z* w$ w8 e8 | i += 4; S! r9 C' b1 D: W
: X% X- o. M# Z$ X. j K% M; p7 S- }8 C$ t* R% ^4 x
}
) r9 {* n) a; K+ T // 添加处理如b的指为-48等情况出现的死循环: E! L% @4 e6 i
else {% s3 K7 U( r: l* @( y9 K& H* z L- S/ }
buffer.put(bytes[i++]);
5 l4 \. C% C# t0 e2 w/ C$ [& C
# s0 q( M2 M v6 X B: w/ G/ F6 X
continue;; D7 z1 I" F) v8 l6 ~
}
/ R/ ~" l0 Z) M4 n9 Q6 s: [) _( R. }- X) h8 U+ F3 B; m
/ X" k4 H0 @! U+ ]4 X
}' v' j; I# T% G' B
^# M, [9 `9 D( V* U, W8 g
) I* M; [7 A- b/ E3 y( p( R buffer.flip();
' Z5 f0 w$ X# f& \% x
3 ]- V m( t' c! v: r! ^5 O/ q: p* w( g6 f' R, ?
return new String(buffer.array(), "utf-8");+ q7 @, P; _& S0 I Q$ f. ?* a
}
* {( c- z# G0 M" }6 t
! T, u3 P8 v" p+ l5 m ^8 }
0 J$ |* a4 D* v} \9 G2 W/ U( s! f, Y% N" a
, [5 A' a" w- _1 S
. O4 m4 ]7 M. p9 v3 j
|
|