|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛 l* x2 x+ j' B" `
$ h8 X4 M/ q1 r3 C
& w; \6 U; _; b- Timport java.io.UnsupportedEncodingException;) ~ }: q/ J C1 E t( J" Q, a
import java.nio.ByteBuffer;
+ b3 {. [2 R. L, k4 Q. Y2 U
7 ^7 ~' h; ~- [+ }5 `# ]/ q8 q, b( ^ B1 y
public class Test {7 |; i& m( c/ ]+ O
$ t% c# G$ t' v, A' H5 A: ], J% q. z t" d2 r
public static void main(String[] args) throws UnsupportedEncodingException {" D b {8 X4 C+ N; x0 Y
String nickName = "得😩得得😩";( ~/ `$ V4 y' f4 Y) k. l$ _
System.out.println(filterOffUtf8Mb4(nickName));
f* y+ ?% s; y- F8 { X }9 {! q) U0 _; F; V
1 N# P0 G, u |/ [* R6 C, `/ n% A$ Y" [2 W6 R/ x; |( n
public static String filterOffUtf8Mb4(String text)0 Z; W+ \1 N# F% ^ _& I" s: L
throws UnsupportedEncodingException {
u/ J! a: t; h3 h0 Y
- C; r, e3 r+ }* m% Y# Z" v
0 z- B( r$ Z0 R) R; ` }8 f byte[] bytes = text.getBytes("utf-8");- g$ a$ }" b- H- V; W7 ^
, ^: b$ a" u, Y
6 f+ J* K3 n/ Q7 j D ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
3 _0 ^% w+ U; d% }
% n; E( J9 B4 o
! |6 K. Q1 x: `6 o int i = 0;
# p8 q- C$ H/ a0 j* ~! d
7 G" I1 {6 O' u: @
. K+ m, p5 M0 ], K4 C3 G( P while (i < bytes.length) {# z7 N0 M, h" \. [( @# v
' S; J" m# c! R: F! I4 N
) U7 i8 J2 B, Q# d2 y$ J
short b = bytes;
, T- H6 a2 w- s6 O' L' t# L" |$ j& K- A6 [" |3 ^2 E; P
1 D, A0 Y7 V- e+ ?% X
if (b > 0) {
4 b0 Y1 e$ O" m. S# t V9 u# Y+ V& [) N
" \/ x# _' l* L: i9 e w9 A" y buffer.put(bytes[i++]);
- [2 m! {) ^, j5 B0 v- o; z& b( [6 F6 S
$ i! n2 n- G& o3 {8 s3 Q4 k: X o" ?: h
continue;
8 q- d2 M9 p7 C
5 T% E. K7 P* K t: y& N
! X7 @- H, ?3 }$ a }
, J8 w+ v8 U( j. C+ J7 h$ h% _ y: U+ e/ O# H$ q3 H. ^
3 n1 O0 H. \; m) t/ D8 a/ g. { b += 256;& X5 Y& [+ \ F k( q: A
* c6 ]# t( k$ @4 x+ W% i
) b/ d, m- N" ]/ [# O a' _* y# p if ((b ^ 0xC0) >> 4 == 0) {
( ^. J2 u7 r4 |0 L% R4 y
2 _, R9 e% u9 m# B. ^5 O, t
" M- t7 P% f) _/ b buffer.put(bytes, i, 2);
; a5 e1 m" ?& g) ] M8 w4 k. J% o# i/ D0 k# o+ R/ M% L& r
9 S. `; F N5 g
i += 2;
1 W2 O& ~1 r& e5 ~0 W" n0 u) l5 m1 H
) d: s* e% Y) a- T% Y
}
6 A! L( E% X! U( t1 ^4 s: {7 Y1 N8 p {: O& r
, Q4 i( J0 S: @6 W ~
else if ((b ^ 0xE0) >> 4 == 0) {7 Y$ D5 @0 k) C6 M) z6 w, {: Z
6 h5 N- H6 i" N! [ W) F
4 ]; T/ X2 O1 n% `# }# u6 A, w, M2 C
buffer.put(bytes, i, 3);8 G v5 U+ O* @) ]) c" o- u2 N" ~
, k; @% x* a: b) J, v. o% [
( M0 t; q" s# K- I" | T i += 3;3 J. T% V) l3 _
0 i; \& a1 v* G" [
/ R( h$ e* L4 |& O. Z% j }
* @1 r' j4 q, Y" U9 C; w- o4 Z9 k8 d5 F. _3 }
: d) B6 m! C- h$ M
else if ((b ^ 0xF0) >> 4 == 0) {" {% D5 w7 \. B. d' [2 A% m E5 n
`4 n; B* v( M
# U2 h0 Z# p: d" m7 q+ ]& ^/ ^) {! c% ]
i += 4;% F, i* t! }) s1 p e& H
6 u+ B: Y6 o- j7 }8 A
0 C3 L4 v4 Q& J3 s0 K j }
( x8 {: S8 g# ]$ R // 添加处理如b的指为-48等情况出现的死循环
! `6 {. Q4 N% m else {
& S7 c, K% j+ U buffer.put(bytes[i++]);' ^3 m9 _' c& K( Q" z; O
) g: E8 S) e+ y* Y0 e( Z
$ ?5 ` {6 B6 _2 T) K continue;3 I7 \9 A6 P+ _) R
}
) e# N5 {8 l/ w9 B5 V8 c h" b
1 i; q' n5 w: k7 P0 `9 f$ U, e. w
- c% A7 j+ T& y8 [9 ^2 X }& I" g" J) K- f' S2 }
0 @0 m% B4 A4 s5 J/ j9 ~4 M( H, R: [! v% }4 \
buffer.flip();! D9 ] M% I* p
$ l! `1 r/ \/ t
( y4 s5 S% M3 m! j9 L; K6 P
return new String(buffer.array(), "utf-8");
# D- w7 O7 J4 Q! o }. c3 @$ u) t6 G
p" ?( X$ H! ?7 A7 V1 B
* T9 m1 d6 j' o l$ R1 j}
; u7 g$ l: I. T. G1 T1 q; O6 C" x2 e0 e: c
5 k) C' c! X. e' M, O" X. @
|
|