|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛$ k9 F S* i! m! _- G7 [
. \ e6 f/ G6 g
4 O, i! M+ ~3 i6 I
import java.io.UnsupportedEncodingException;" M: W8 N+ Q3 a S; Q" w2 v1 {& ~7 P. H
import java.nio.ByteBuffer;
5 m" v! }0 \' X$ N F3 ?* J6 S1 N! V) W; X: R0 ~( N) S: C1 Q
' @3 \* ` [6 `. u$ n- Apublic class Test {
! s: q/ B3 I) d5 m M A
8 u% ~+ @8 E2 Q4 E, t7 c# ^7 g7 m# z! i! l( Z, M
public static void main(String[] args) throws UnsupportedEncodingException {: V1 l5 V2 J7 J( |0 x( B
String nickName = "得😩得得😩";
& ] o7 h8 m p5 R" s" s/ w7 p' T System.out.println(filterOffUtf8Mb4(nickName));
$ E5 y* w G0 _+ _ }- C" o+ @& b, j' N% x' U
$ b2 D( D. i) D0 O4 w T) J
& n% w! _+ O: ~: j5 r public static String filterOffUtf8Mb4(String text)
4 E9 b, ~" H+ d4 d0 A throws UnsupportedEncodingException {6 F0 }8 T0 N) M4 j s9 L
# n/ ?" `5 c4 R) P7 P% R
0 t4 y7 j) H; c/ i4 }2 Z, `, V byte[] bytes = text.getBytes("utf-8");) ?9 @6 M+ o% e g; H
. b0 B8 g J4 w/ Z
6 _* C1 [1 Q- N1 }: h ByteBuffer buffer = ByteBuffer.allocate(bytes.length);8 v* L, V$ E- W' R
) t& y" G$ b# T6 z* _/ u
( }! _5 @$ |2 u' K C/ z- Y% y int i = 0;; Z$ T8 z% w+ T
- j. U" N I7 l& L% W' D
( [; p9 H) N0 }/ i, a' R while (i < bytes.length) {
- A! B) s3 g! o. |) [) ?8 t' d
! P+ S) W1 o$ T( W4 W9 s" e" [& |
" [5 p v6 L+ t$ v short b = bytes;
) B# {% G* H* E9 O2 | M# S8 W4 E, }$ Z9 G L" d7 f
2 x7 {2 p. F7 j+ j( F
if (b > 0) {$ [. n; i8 `) B& b
p4 H% k9 j( M5 C8 l8 Z) e' a
6 ]9 V7 q' Q5 O! r/ a3 L9 B buffer.put(bytes[i++]);& a$ m* J" j4 G$ i3 [
/ @1 a2 `' a; |% R4 q: }: ~2 Y% a6 u- g5 r
continue;0 G6 p$ P* [+ y- w+ k) X
, y8 s5 R) G) Q# j( X9 S6 A1 _6 t% O
/ N8 q& C+ K, j1 E4 s7 x6 \ }
1 o+ N: ~( e2 n# U
4 j- N/ C$ ~% {1 W
, D5 @) o7 ~7 U) i b += 256;1 c- `' j( l. P4 I; w2 |
! `. B6 _" D5 L* x9 F+ D* n3 J9 F
% W- p" P: \# I, z" o) s+ y if ((b ^ 0xC0) >> 4 == 0) {
8 Q+ T5 `$ i2 \% S* T
8 K8 [0 e0 M# S% N
/ n7 p% B" v$ b2 e( E% x( f buffer.put(bytes, i, 2);
/ c' d: V% w( Q p! X! S+ k# v! g4 J
8 S4 r2 G n; c4 V i += 2;
5 U* D1 `4 h* v0 R# K1 |( @& A4 z5 h; [
2 w% X0 ]* q$ R5 ` y: A
}
3 N4 k0 I% I# {; N- \; z) C: v1 s8 v' L+ b- _* n/ }$ U8 ]
# J+ l$ k7 x. l( I9 r else if ((b ^ 0xE0) >> 4 == 0) {% n9 y1 V3 y }: ] X8 g
9 x/ \. C3 N% T4 M& F. y3 l" H* M( A5 s, Z
buffer.put(bytes, i, 3);
0 D! B; B8 y) ^2 E Z# V, i6 G# G6 K0 y8 A; i E
9 |# ^! @* A9 ?, b; z" ~
i += 3;0 D; I9 Z5 _9 `7 p
7 O, t4 x6 R7 f l7 J# s4 }+ S4 o1 D# _
}
( {! l9 K- q4 S& y& P* u. e2 V- L# G, Z) B" N3 y
U% \$ ]- N/ q& F else if ((b ^ 0xF0) >> 4 == 0) {
6 N3 A D+ r0 d9 R$ ?. r6 x/ t& u( X5 ?5 I' ^
8 Y0 W/ G" Z* k$ Y! ] i += 4;0 Q, |! t1 k. o% Y9 l
- @# `6 T z- L _& t
}( B% L* B- X4 M& ?. R2 a: q6 W
}' [ i" _4 x3 A
// 添加处理如b的指为-48等情况出现的死循环7 |; W. ]1 P4 `4 ]( O5 k8 l
else {
; S2 W& a( D0 F1 [4 d1 o' p buffer.put(bytes[i++]);
+ h& t; _* U1 z0 D, o6 B4 a6 T* }# T- K8 }- D" U6 F
: t" W+ D4 M" q! h4 K
continue;
( x" t! Q# ]6 T) ^: x- B }( J! @' m. R4 G% ^3 |$ l
6 q0 e$ Y! E& v9 [* Z1 r
: \- p! V$ {8 x- A5 Q# b }
6 O' n( s+ Q5 T& T6 ^# V& n3 `& F0 h6 _" q) J: l
- r( V, _# [% n" j$ ] G6 a
buffer.flip();) ^- m, _' ?8 s
W9 M4 x1 R0 a* k( `
( B! v9 L) _+ S* T return new String(buffer.array(), "utf-8");
( R8 {9 P4 }- k& a }$ m, z S4 O* I* s. m3 f" U% N& B
4 T. g6 X" W3 g/ @+ D$ r) N- T8 ]
) x/ p, n, l ]
}
' p& d3 G: A j, m+ Q( N% M3 Y( H8 N5 D; r8 |
! e6 i/ d7 H1 _* }& @/ z: s |
|