|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛
# p/ |, X% U. z% h
, b5 o" X: I$ `) [0 D. O7 [, M
7 M3 e7 s0 I1 _: e8 [import java.io.UnsupportedEncodingException;
4 h- N/ y( V5 i! F' q6 O* ximport java.nio.ByteBuffer;1 _+ }$ I7 t5 {( D" T, t8 t
" }( q8 N4 ^7 o1 a' U- L: e7 k1 |: u$ l2 m
public class Test {: a5 d; {" G f$ d1 F
& o# K" S. P9 r' ^6 m) e
$ G9 p( H) e3 W public static void main(String[] args) throws UnsupportedEncodingException {% B5 o2 |8 X) u6 {) w1 s
String nickName = "得😩得得😩";
- R" L+ H$ P; ~! S$ L* |" l7 A$ L System.out.println(filterOffUtf8Mb4(nickName));
& t; ~3 Y, C1 }* U+ ? }
, I! d. G0 h) B& l+ F+ r# H( X1 @; i z2 h! L5 o% E. J
" q8 i3 L3 @& g: e5 a1 K5 R$ S public static String filterOffUtf8Mb4(String text), ?0 p6 Z0 A( F8 s
throws UnsupportedEncodingException {
0 G0 K' @& J! m' U1 U; {8 O
" b4 y, U" d' K# t' ?
9 Z2 d \- ~! E' U! N. x byte[] bytes = text.getBytes("utf-8");5 a; {" g, {3 [ j; S
+ G( k3 _, ~8 F0 N' f8 q( _# p+ _4 g& Q
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);2 y! }! ]2 Q8 t* @3 P
6 ~; s' A- U* r- O9 p" [6 L; D2 K) K o" |
int i = 0;
3 ] [& O2 n0 X1 M) a, v/ K
# ?/ s" Y/ @( ~; z7 h2 e1 i% o- X4 t8 \/ s
while (i < bytes.length) { M P% E o8 i4 u* M! U. U
6 p) M9 A$ Z0 I6 s X
+ q2 ]% \. R! Y+ B1 f4 }' R
short b = bytes;
6 m* s- K+ a2 b& o/ ?: }! U% M9 u% }. {
/ }) K3 J* ?$ `$ u0 a if (b > 0) {* C( r, Y0 M6 g E8 h1 \
6 {' ^& i5 y) H+ i* T* I+ U! l
c! S6 u# [& N: O: g, R buffer.put(bytes[i++]);
' z! z- L) @- [+ r; T2 `
6 H) S) ?) }! S d6 k9 k
% s8 A# z6 m' r( S$ k continue;; W( ?- z9 G# b0 F7 p
7 ]$ s7 w9 {! ~# A% m3 }) ]8 ^7 y
% t' D9 L) O i8 I) s }
# g1 h: `& d5 x+ L) i r
2 G/ F+ p N# c4 P4 e
4 y3 p4 ?; a0 W. }4 h. L* v# j b += 256;
. ]9 N. V& c* i7 x; |; z7 X6 t9 w2 K# Y& M1 Q+ n5 b
& W& _( g3 K9 H# _# n+ {# s if ((b ^ 0xC0) >> 4 == 0) {
% n. z6 v4 v3 n, B1 N
t6 n! \0 J( L8 C1 ]2 E0 |
; \; N& V- j9 N% r( v. u ] buffer.put(bytes, i, 2);) W) Q. W# p8 w6 o8 q
3 j! z5 R5 X% y& p7 K8 N- I q+ W! t0 C
i += 2;
# R+ D* b5 c0 Y* \/ ~2 @ |2 A( x$ L0 P; Q- K
0 |( K. z& v) O9 Y }4 U0 p# k, v$ c! |
A. k2 K) H' q; p1 u8 Z
% ?+ W& [# e9 T! d- R" f5 m4 }5 R else if ((b ^ 0xE0) >> 4 == 0) {
7 V9 W3 A3 R! J! u
) w. u2 b$ d0 G- R/ Q/ Q: C7 ]7 L. N* }. m' w5 u5 ~
buffer.put(bytes, i, 3);
% l" R* Q! ~8 `) f4 R/ Q4 Q' z5 v8 O, {3 `0 \ e: f
% k& Z, f X1 \* X) Z, f: e* M1 Y
i += 3;' Y7 \8 a y! c7 d
3 A) P- I! V; |/ V, n5 s; R# \& n. I4 I: T" D
}
6 I( C- m( u% p8 Z5 A: x; G$ t
3 _! l. c8 Y$ m: [$ P, w2 I5 N6 k) K( u6 G8 y/ C% O$ D2 Y
else if ((b ^ 0xF0) >> 4 == 0) {
- U( C7 v& x# r4 A6 q4 }& U! R
/ g" z* Z9 \! o. p: B6 x' g' W% X. D! O* S
i += 4;+ Y; j+ X. V1 V/ `7 J
9 p+ T; C, ~# s- c7 F4 p/ J/ S* m6 m/ U: ]& ~1 R- b! M
}& q% b; {4 P; @# u% K
// 添加处理如b的指为-48等情况出现的死循环; h4 c) f& z4 U7 L! T$ F1 I
else {
, w2 [7 t5 m [" Z6 A6 I buffer.put(bytes[i++]);2 v! f( m6 ^6 ?, Z9 k
( M" x4 E0 r" |
9 h. [+ S* Q& B( p
continue;
, Q' S" Q* d6 C; m6 Y7 Q; | }
4 ?$ {: r7 y* a$ I# r+ {2 B+ m9 {: }, M% t+ i
8 K- B' z9 J# ] m- i4 m }
/ c5 T+ p; Y `( F9 n1 `$ {$ h$ y: Z7 i8 X) u2 R {
( c& C' o- z+ }8 f `! S
buffer.flip();+ Z# A+ M3 b& e
% T. w U9 X: w& @8 }2 s
; u! G- _) Z" W( B8 ~ return new String(buffer.array(), "utf-8");& M5 W2 F: k2 t. N# r
}
& q8 ?. s: t8 G) ]+ A% @
( H% c6 D/ O& q# H6 C. I
4 g4 L& ?0 T n8 n! w}! u3 L, w+ R6 T" ^. e# }" ~
: I, A- }7 d `8 ~
1 |' c# X# h- r1 Z% o7 f, a- L9 j
|
|