|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛
( k7 `( G* `) \! N$ U- _2 c% @- s0 f7 q$ ^- r# n. [
0 Y. K7 F& T4 Y8 e
import java.io.UnsupportedEncodingException;
7 p2 c* ]/ C3 C$ @" limport java.nio.ByteBuffer;
$ D+ Y3 Q" u& M8 ]) m+ E8 |* Z: {+ \3 }' Y
& U0 o* c2 ~* }& w; D6 D4 Rpublic class Test {
( q* W: l9 T, L: s' g, B4 G
* i. d5 K! z, A6 ` ]5 i
( ^5 J& a9 n5 P& Q8 b public static void main(String[] args) throws UnsupportedEncodingException {
7 d* v; h% C* p" V/ ~ String nickName = "得😩得得😩";
4 P: b5 Q" c2 I9 R# G9 u System.out.println(filterOffUtf8Mb4(nickName));. ]9 p* p0 H2 Z8 n( W% m
}! R% L! ] V$ ] N; e6 ^% a! I) v
6 H: l) a/ ~+ K I2 r7 n4 N
0 N( h4 c% N4 p0 G/ n N/ x/ ^ public static String filterOffUtf8Mb4(String text)* m6 I* N2 P1 R: A
throws UnsupportedEncodingException {
0 q+ i4 `! A# r/ O) F7 B, r
! a% S7 O( W/ d$ G" d5 s( `8 C+ K2 \, W! G7 v7 w9 C
byte[] bytes = text.getBytes("utf-8");
/ |5 ]9 E7 S2 X5 O6 z* {% ~; M9 |( ]
7 P* B$ @* o$ H ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
+ w% s: Z. B* X% X/ M$ ]
6 H2 ?. a$ K+ |8 h
3 N/ g4 d( r/ B7 @2 v5 v" S' ? int i = 0;7 J% I* F3 t8 W9 U
8 F3 R. ?: P s% J( b- l! L* S3 ?
% d3 f) [+ [* e$ i2 a9 I0 E
while (i < bytes.length) {
; L P* N* B* f- V2 r7 e$ p8 p" l r+ J1 t9 X- T; X+ s
) |* a( }. I) T I0 o
short b = bytes;
. Z9 g9 m3 p+ }5 O' q
) J F: w8 \3 V. |2 i0 \3 E' W& m) u f* o7 ?9 _
if (b > 0) {
' w$ \' M9 g: L) ^6 J( G/ b K$ s+ V0 O
, a! |, U0 I/ }: v4 X5 J
buffer.put(bytes[i++]);0 l" e* U# I- d, [1 F" E+ T2 ?
7 x1 ]' z0 T! r1 M+ L, d; a) Y$ R6 D3 ~: V& E: g0 u" K3 R* r- L
continue;" {" x) S* d0 T5 t7 @- H
. I; V! S6 ~! O6 p) a& ]
2 L V! N1 ?! e7 }% {6 X2 B
}$ a% {1 G1 Z/ j% g9 ?7 F: N
; d! _/ |2 ~0 L9 `2 q
# f+ z! @/ [/ X b += 256;
5 |# K! e% j" i1 C, S
1 |. V, ^' Y+ j; \
- Z5 T; H) T6 } if ((b ^ 0xC0) >> 4 == 0) {
! q7 ^3 V& x2 z& p' c
: E6 ]. l: _; K/ f& O" R6 ^# Y# `9 O9 F, R3 _
buffer.put(bytes, i, 2);
- E/ Z) B) C4 G% P1 ^4 Q8 G1 Z) O
) |) i- A4 V: S! g; ?2 T; d& ~# e' f
i += 2;
2 I# a6 \9 ?7 I; O0 o5 Y% ?/ d
+ E4 |+ J, |: r5 b( P( t5 H: {1 G* A1 n3 y4 n
}
, J) X: N0 q. a8 n [- t+ K: ~8 q4 J% W9 S. r, I) R% R
/ F2 X- s; d+ r K- @( m6 H/ ^ else if ((b ^ 0xE0) >> 4 == 0) {
# l: f$ g/ c, D
' }& S4 Q( ^/ r( j( z# z' |, O( h9 r' N2 _! v/ u
buffer.put(bytes, i, 3);
) p6 Y( l0 Q) c% J# D0 G) Q8 d) \! W3 U, h K. s1 o
8 P, f+ K3 Y7 q$ _: |' T) w i += 3;
4 z+ p9 M0 E; e$ h6 g. Q* d' }) g- I1 p+ U' Q' C" o9 k
/ m& y, o S6 H+ ]" Q" R- g' i- h }. Q+ H' N8 S% v* X) m. o/ `; x
0 j; T" ^& H( N/ T: }5 ]+ A: F8 g
8 n, ]: A5 q5 R( d$ b' e else if ((b ^ 0xF0) >> 4 == 0) {
5 P; b; a' X- ^+ [1 Y
, K3 K+ j8 E7 B8 u6 |
$ _$ R9 c1 g8 P- @8 A# |$ g$ G i += 4;2 W/ i6 l- L/ I0 [6 i
5 v5 f& F2 [- d9 p
3 i, Q- Q) V- V }- A. t, u3 Q0 Z7 e+ c
// 添加处理如b的指为-48等情况出现的死循环( H: K( q* {* k: `- C: o' B
else {
2 c" R/ t+ l9 M buffer.put(bytes[i++]);' @6 Q/ _# I/ j$ \ E# {4 P
5 I& u, @ u1 ^: C. S. ^% @/ F; Z
/ G& @, P c3 j& X" w continue;& ]( l" C6 n2 ? t0 M
}; w F2 E% d7 G! ?
' d- Z" C; m+ }8 y' g' o" B" W* u
}
/ j8 ^) j) q6 k" Q) M9 J6 X+ _6 f$ @; U" e7 M
! O% a, t- t" [ F
buffer.flip();
+ y& h' a. d$ W' y8 K6 O* V
. k/ a2 ]( _6 f9 {7 Y9 q
6 f5 A5 ^0 }6 n# L: z return new String(buffer.array(), "utf-8");
4 o6 ^- g7 i7 l! L, F }) F) A: M2 }6 ^
8 g2 E r# d# Q
# I' k! t' g( t7 c}/ Z% C1 I) d8 h$ b7 |
7 k( q8 V$ ^# @ f# U( F# l, p/ O, i: g- W& }7 ]5 ^/ \
|
|