|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛
. u& s/ e: c$ }# d8 k* o
0 I5 X1 I1 ]4 r5 c
, B0 v$ a7 j) o: T! x- |9 pimport java.io.UnsupportedEncodingException;
( R- A0 c# T( L# D8 b/ bimport java.nio.ByteBuffer;
1 X/ g% F8 C8 M1 ~
% e1 _, Q9 @0 j7 L& Y2 E$ d( u1 ]( L1 M# H3 W
public class Test {( V8 x' Q: J8 G* ^" n; k; f
2 Z, H5 `* N2 r6 `5 u
) Z P6 y% u! c- N* g+ u |3 v public static void main(String[] args) throws UnsupportedEncodingException {( ?0 ~/ G( }8 ^
String nickName = "得😩得得😩";0 E9 f0 a* P* ?8 y8 K
System.out.println(filterOffUtf8Mb4(nickName));
% O2 s1 }) G% x3 m. y }
! ? X! X$ S0 E) t7 K6 p$ z- h8 p, l& h+ R2 E8 y
' S. M) |9 A* B+ J- s public static String filterOffUtf8Mb4(String text)
1 G7 W7 b: U; V4 _9 m6 S throws UnsupportedEncodingException {4 i1 P6 S/ }+ ]" x( A" g; n, U/ D7 x
* q9 j( ~' U+ @2 y* g7 j# L1 c- t/ b
4 t, d; G" k; }- k2 ^0 n3 z- x byte[] bytes = text.getBytes("utf-8");, Y: P' }2 L8 z6 H: R. j8 ^8 r
- }: V# `- G/ A A
1 U5 I- A# l1 k* B3 G
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
1 r' ]" c. O e7 J7 z0 _: j- p9 W: y' o8 {* ^
/ ^% K: y! D( g* L' n/ Z
int i = 0;! M q, J, C7 ^4 I/ ?# ~
- @" ^! J# _! N3 o1 y
+ d5 l- v' m4 O4 H6 ]5 a6 ~- b while (i < bytes.length) {6 O6 u9 |6 u; Q( l
6 y7 x/ _: q. i7 Q* `, Y6 O. G9 G7 p6 ^" J+ y* m7 ~; F
short b = bytes;* I$ C2 M9 N" r$ Z+ F8 P
' {* U- y# A) q
1 h* A' O, ?4 W6 U) a if (b > 0) {0 E* i9 V$ \$ D& ~1 Y
, X2 j P* Y4 v* |5 e0 @
$ K7 }& Z6 Q6 r' w
buffer.put(bytes[i++]);
& m. g) e" A* f z
2 ~/ e" O6 Z& F0 u, ` t k: Q# G- I1 l8 y* U
continue;
% ~0 N% R' ^& x$ q- X- N2 v( X
2 D) R8 P' [+ Y4 c
: R( `( t3 b: u: z! _7 \$ j }4 Q, l9 p0 l0 ~" R, x7 ^' n+ \4 p
. e2 [' l5 f! F4 }( o. _5 `
+ }, d& A! M1 Z' c b += 256;
; j& I* X6 _: X0 Q4 `/ s& v3 f* }7 J: V7 S
1 s' ?8 T- |/ H4 l& n; K if ((b ^ 0xC0) >> 4 == 0) {
6 Y% g6 B* O8 w; S, R: R0 s% ^1 O0 V l' h1 ]3 h+ E
3 b5 J+ }% X& C7 ]0 m- J buffer.put(bytes, i, 2);5 A: o) [7 b! d% C
( j7 T8 N2 A# X' d* C1 V' P$ m0 l+ J( s
i += 2;: Q% I5 W( l9 g# g5 `/ j0 P# z
: |9 Y% P1 `0 s0 C& C
+ f1 n/ _( C- g8 X( P0 O }# J3 L) r7 t# Z# |" i
7 ], k: R; z3 B5 S6 O# y
: ~# P) t/ r+ u7 }; h4 f
else if ((b ^ 0xE0) >> 4 == 0) {( t7 W" i5 t0 h2 u& |
9 Q& Z0 k$ U- c$ a1 ^. S
0 i( J3 c& c" P5 [7 f: B9 d
buffer.put(bytes, i, 3);8 Y4 K5 a# Y+ k! |0 Y
/ _8 o5 n* Q% O0 J/ t. K
|% L! l7 _( d' u; B/ v i += 3;
+ O7 f ]& l8 [0 l* n; y5 @! j, `9 |2 k/ I7 S7 Y
( O- A7 v% p9 \6 }% B7 X* y, D
}4 o* n. p1 b0 B) K, `3 w0 d& ^- f; V
! b% I( R& k5 Z) }1 I5 z+ K$ G# B: A3 y
else if ((b ^ 0xF0) >> 4 == 0) {
7 ]+ k* p0 b: d3 Q- d1 o. t( b! B* O1 J1 W$ V- d) n( E0 @6 O
) v8 @6 e4 a1 F. e, u; @ i += 4;
' |" \' i2 N( l$ Z& X
/ G1 H% `$ U2 m' t. B$ |
6 _9 ?& \) p# B2 X" O' P } m# [4 x0 f3 l ?- |
// 添加处理如b的指为-48等情况出现的死循环3 j f3 a( Q$ P$ S1 B1 D! s1 B
else {* Y( x% l2 N9 h
buffer.put(bytes[i++]);- `% f' g" `4 @$ q+ C. j8 Z G, H
z0 B; n& W7 p% a6 ^* b4 K# U2 P8 {5 S! k* Q5 P. j* m0 i" }
continue;4 W! ?% k4 J+ z/ K
}
3 g! K5 F5 [: [: q2 k
8 G; v# d, T/ @
5 Q. b4 k4 @4 t+ D( j }" E }/ C3 g3 j. q
: ?4 ?3 y3 ]+ w2 N# B
2 a; {* C! ]+ U2 x9 R2 ? buffer.flip();
0 f9 P' `" l6 N" x3 t
, b% A! n, X4 T
' E" C" ]. m6 Z return new String(buffer.array(), "utf-8");' r" s) g: L. Y- g U8 k! Q& G
}
! x+ B6 h" _- U: E) G" B r T- j. F$ G! y
- N9 ^5 A! j& Y& {
}1 Y4 |, i$ ^7 P( x2 \3 C
+ g$ Y7 x# i1 z$ }( z2 E4 p
# k1 J5 D7 ^1 c7 A( q% z, [2 c. p |
|