|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛
+ I; j/ D3 ?) x0 n
" `4 h% F | L" C4 V2 {1 S. D/ P
! I9 U% m2 V6 @' Bimport java.io.UnsupportedEncodingException;; P- d; D: z1 ]5 p5 w: o- x
import java.nio.ByteBuffer;. r2 f) w) r( r' z! E2 l
2 F7 i W K( u' a6 z9 k4 z: T
! S9 D( N5 g* ?! G1 R; Upublic class Test {
& `- L$ Z3 r8 C( h% {
6 K9 O' J, L) @ O5 m, p5 a, _$ R% \3 }
public static void main(String[] args) throws UnsupportedEncodingException {* X7 C) U1 b2 G% w- P0 n8 i
String nickName = "得😩得得😩";$ o6 y F& v) G$ b' Y
System.out.println(filterOffUtf8Mb4(nickName));
$ X6 S3 w% n9 t5 { }
- Z# t) w! c9 y+ E' H
- g5 n* A) k" S
7 i$ O# J. y$ B! ]# h; w public static String filterOffUtf8Mb4(String text)
& u' L( Q) i) V3 q throws UnsupportedEncodingException {
. {2 S" `9 ?4 i: b8 x; K2 e9 X- m0 M a! [
2 U* M8 {3 P: e8 X6 O byte[] bytes = text.getBytes("utf-8");
3 b4 F4 c+ o9 b; R, O) z' K6 |) Q( O: A; x P1 S& j# R
' R( [; B H7 G9 c6 q- W5 V
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
, L9 a5 L& R4 [2 h3 k: g3 S
7 U( U% O8 ~# @+ J- w& q! T9 m( B0 J" z" o
int i = 0;2 C n* [- ?7 m& ]& }1 ?$ C) S5 c
# N2 z1 T: y; m1 O" Y7 `, ]: A* Y& }" K0 P4 P0 b& T; o
while (i < bytes.length) {
. n5 s3 @; P8 G" z! c- p
! g2 E. }/ L Q8 N5 r$ h, W) a5 p9 E8 c: ~0 ~
short b = bytes;0 h6 [: M+ ?) s- R& j
2 ]8 r5 h% k- E* g4 d% D5 t1 r6 A/ ]; ~/ g7 b0 F
if (b > 0) {4 B- K8 J! `0 U) |) O
+ L" E7 `# E. ]: a3 t* x+ `) |
" ^! {& N( [! H buffer.put(bytes[i++]);
! L. N# y. |1 } \2 X( i/ K8 V1 b. j9 ]/ {1 C, o H
. Y: r& u; _5 G
continue;
1 E$ P1 {8 |- Q: y7 u. a9 f0 C( X
3 f0 v7 k) q/ F }! N! Q; h* b% A1 \# ?4 ~# M
: ~+ P3 Q: f; }0 j& |+ J( R3 A
9 ]: K5 M5 _) z6 o! N6 i! J7 b* s/ o* X
b += 256;
7 P: x# j( j; {3 A. j; z; M w# D" ]' `' ?3 O* r
, I# \' _% k7 Q3 A+ }+ G- h
if ((b ^ 0xC0) >> 4 == 0) {( M' J B: C- C3 ^4 e3 C
* Y7 ?" S+ Z9 x
9 i2 ], u& d c$ K2 h
buffer.put(bytes, i, 2); `% W# X& x# K2 g
$ F4 Z; s$ o# N6 q' z1 T: H
& l& O7 g, q3 K* o' U
i += 2;* i1 u$ j/ P( O- Q( ?4 Q* @. z
/ k2 b. q: j+ h- c" c( c& J
: c: r3 i/ W- p A( D( w+ r& u$ e/ O }& d7 f5 M) [+ i1 j% V: {5 W
( @- T$ O( ^9 ~( x0 c* x8 [. g3 r8 Q4 p, s6 T$ W A2 Q; l; Q1 ?& S
else if ((b ^ 0xE0) >> 4 == 0) {
& s; v* d" w' z
' t! U- u( i# q. @4 v8 J
) y C8 U) R; b( M9 r buffer.put(bytes, i, 3);
. J1 N& G# q+ E4 p+ U; o. {0 p6 m# x) z4 s: C* E- \
/ w8 `4 V% V' m6 Q& Z% A1 t- g( j i += 3;
l( B' V9 m9 E& j; _& h+ _$ s$ g4 h! X* e2 e0 W/ D8 [5 w, h
4 ]1 N$ x9 A; G- e/ L" f
}
, {9 y/ F3 j+ g& o5 B1 ], v, ~; {: U8 D y
0 [, {" {9 M! p/ h6 b6 M3 p
else if ((b ^ 0xF0) >> 4 == 0) {6 @7 z) r1 j6 }9 G* f( u7 p$ N: {1 }
/ B3 _. i& y; O4 v: G T8 n0 G
! J, a- V4 D' b7 n; X7 F i += 4;% a0 v1 Q7 m& u/ v& v
9 Z2 ]7 o; b, |/ M
( h- t# ]$ W. @ e* _. a' z }( I/ t$ `8 T' ?
// 添加处理如b的指为-48等情况出现的死循环$ U' c/ i+ f6 {. Z
else {
1 x" U- S& C+ r& \& c7 u5 x$ {' N% `1 R buffer.put(bytes[i++]);! b4 b7 F7 ~; Y) Z; m1 H4 D
; `% D- C- ^( K# c* X
0 J9 E( E7 `0 d
continue;1 s6 \( }9 O. }. c( [0 p
}
: Q6 L4 J5 Z$ p/ D
/ T0 q7 @# m6 \% @
3 K# S% u* }1 `9 Y }
1 _& v, Z5 `; p0 K( F7 ]7 _) `. e u; F _* l# d" k* y1 ~
, V$ {0 ]* m; j
buffer.flip();
4 s# Q8 c8 i/ H
# {* ?/ \6 ` M' z* t$ \& @" ?; V' p: D0 _$ l- Z: _& ~
return new String(buffer.array(), "utf-8");5 ?/ O9 ~6 E/ s# [8 i
}" q. \4 y, l, e8 U9 W7 Z; q
- v- l# K$ H0 H: a1 [( x
- x8 _ V7 W6 l8 z1 @/ B, M8 G}
# p) c/ }7 A6 ^' U S3 l
7 b: D h2 d" Z/ Q/ d+ R/ \. e5 Y9 P0 n
|
|