|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛& u: }) H2 E" v# |1 }5 Q& t0 N1 e
3 E" S. X8 T% k
* k3 l$ Z) }5 \/ V* {% o N; I: jimport java.io.UnsupportedEncodingException;( b8 ?2 }0 t% ^1 {0 v
import java.nio.ByteBuffer;! z7 g+ I. t/ f. F! O
# p' k1 N! {7 r( a9 x
* O4 b' P+ H1 }6 n2 Z- i7 |public class Test {: [0 e8 |6 W- U
( h, s/ m9 [5 p! d
7 X7 S3 b$ ?# }6 k9 H public static void main(String[] args) throws UnsupportedEncodingException {
$ C% Q1 c/ T0 K3 |3 m String nickName = "得😩得得😩";' g/ F6 F$ @, C1 O8 I0 J$ b
System.out.println(filterOffUtf8Mb4(nickName));
# S4 }9 t* T/ `, C }
2 `( K6 H; O( Z. D
. w, q t+ `+ T! e
" ^/ c) |9 ?6 E0 H3 V" e public static String filterOffUtf8Mb4(String text)
. z5 S3 e6 t, U throws UnsupportedEncodingException {5 x C$ u+ U' v) ~0 c
8 e+ ^+ D# `( u1 f& K% \# `
% C# n: Z# q+ V1 U byte[] bytes = text.getBytes("utf-8");
0 g8 G, W+ {0 c6 k7 Q9 @/ k* s: L; ?0 c0 V; l+ V2 `/ g# k
+ a( h; p5 l. k2 H4 G
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
, K; r4 G. x' ~1 s+ T3 p% U% C, s% b5 `
" U2 D7 R0 {2 D% W& [ int i = 0;
0 i& V$ d+ g+ P* f7 ?1 y y( c- T% Y# E; r; |$ \
! J6 ~, d0 N" e" A5 @
while (i < bytes.length) {
+ j2 j" Y1 J( k% a( G! Z+ E. [& n0 r' f$ `
& L+ Q% o+ t! X5 F short b = bytes;
& A# f! R' X; V/ _, Y7 j
5 d- J. x) u* V P$ m* M, _7 d0 G" O1 f8 B( [
if (b > 0) {/ C0 V! q" _ n/ _ E* o
" @* A& u: I( I4 F W" x$ `: n
/ P( W, c( r9 h' Y7 x' c buffer.put(bytes[i++]);
8 F8 |0 {: C2 s* I6 u5 b
3 v4 b% Z9 V& N, c: @
! l. I) r/ D4 {. c4 K- q5 [, w continue;
! d/ z* |& \ }8 y' w! s9 T6 h) S9 K& [; |4 l% R$ s
: j1 T3 g; n( t4 \: W% g3 \
}- O5 t5 a- W% i% Z
* L# e; q. X! r
* O, s( p: r# r* H# m
b += 256;
+ A2 @0 o; l$ }/ f: C" z6 ]! H$ y' G+ z$ f
& E g& F: M; |. v" `' P
if ((b ^ 0xC0) >> 4 == 0) {2 Z9 e; a [# n- C
% J5 [9 C& W2 P( B" ?1 I6 t
! O4 H$ O* O# m, s1 D% d3 H I" z
buffer.put(bytes, i, 2);
$ g5 n5 c& H: q2 m# ]: O' @" ^& B/ d4 S( J
9 S- V$ \& ~0 a0 z
i += 2;3 S* M- }: V' a' W. Z7 C5 I$ e
e5 K# j2 |/ f% ~) b! C' B+ [
0 k/ w% W! f0 u( R
}) }, W2 E3 V5 a% s, m
! |: d$ Z6 z' G) b" b6 `0 {& s6 J& f& X6 H( E' } j
else if ((b ^ 0xE0) >> 4 == 0) {
; Z4 Y2 Q' Y) V; y, t
, \3 m* i( g5 E
; @9 ]* t/ L6 Q2 Y7 b: q+ [7 M buffer.put(bytes, i, 3);
$ c2 Z$ U! P- e F+ R" H; |8 O w) j" b" M8 S5 Z+ S
6 F/ L: t+ C% a' a% F8 A, N
i += 3;
% B# ^ j9 }0 J, ?/ R3 g e! A0 P- ?5 I( p. N# N$ z
) `3 c* |: x8 S" d" Z& Y- g
}
3 u" @+ F1 M+ P" I9 E# b5 X! J4 a7 I' n
7 B3 L) { |0 D" C
else if ((b ^ 0xF0) >> 4 == 0) {1 \& C# g) X0 A' s7 t
+ m/ Z; @0 m6 d3 `3 j p0 l7 k. `8 W- D) _4 {3 |( k$ N8 H) z
i += 4;+ A l3 M4 |: J, \4 U# [. u8 |4 i
+ i2 ?9 v1 a! o
6 s: c) }9 U- _ }2 Q. Y5 o' N n' |2 Q6 Y( t
// 添加处理如b的指为-48等情况出现的死循环
( S1 y* u" t& ^8 w* _% T else {$ x# ^$ P7 `0 `# T: f
buffer.put(bytes[i++]);$ ]# O" T2 B8 N8 w' Q
! Q% ]: Y7 s. H/ ~ A
- D5 y1 |, W: _ continue;
, t8 h+ {8 x0 S. U# G ^+ y+ X }
1 n4 s% P8 ?$ V' T0 d) w
5 V+ _/ x0 O$ Z- ^$ p
/ c1 H& J) E c8 q4 }2 x% B" l: r) o }6 U! `% t' h4 V+ z* J6 o1 |
* |9 h' F8 ]; ]4 u1 R
; ~- @; z: S$ j- r" S0 ]
buffer.flip();
; N3 L* U& U, H2 J# @
; `+ s5 ]# P' m3 u) P3 _: n2 a" ]+ u5 N+ ^( Q1 U
return new String(buffer.array(), "utf-8");% i5 \# u- Q; z) i$ n# v" m
}0 [' }; ^8 M& M! x, [" P
7 C* K/ n1 z4 \4 j& J$ u# }- D6 G3 X2 r
, R& q7 S0 B! N, V9 o6 g
}* `% M4 j9 R$ \* Y2 {
L9 u% J" S' \- `) X
$ c, T N! [6 A. y; e' X
|
|