|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛/ N ]5 t, }& S3 d2 e
7 ], A" g( Q8 S! f; `/ a; i
2 x* O5 E0 i: J# A8 V Bimport java.io.UnsupportedEncodingException;7 R5 q3 [: T1 g& V/ ?# y
import java.nio.ByteBuffer;' l9 n3 X' Q/ p0 f; Z
: n- Q$ q! t) o) ^& w6 C, w$ T: w K7 [, r1 y. {0 N" H+ s# O
public class Test {
: ~( \# J0 c6 G3 r9 E* H7 N$ p+ ]4 p9 f" V, t- M% O& q
6 j0 {' c+ b* f. w9 e public static void main(String[] args) throws UnsupportedEncodingException {. O( M: x9 W9 N1 R* U% O i2 H
String nickName = "得😩得得😩";3 p4 L; g$ M# @$ `% {
System.out.println(filterOffUtf8Mb4(nickName));
2 {/ z) _+ m2 o8 S( e, O9 p }6 d4 s- q- `+ _/ i; B
' k6 M0 x0 {; X4 {4 j! v; _
- V3 F8 n2 | H4 E public static String filterOffUtf8Mb4(String text)
& R% }* d9 c6 L2 V0 J throws UnsupportedEncodingException {5 K* {$ r d9 P" o$ z+ O
1 ?4 T) G5 H6 M5 z: @* F
% x9 p3 E1 U2 r! v: d7 d0 | byte[] bytes = text.getBytes("utf-8");
( d" _$ e" e3 q$ Q" E2 N0 {& I9 ^% r, Y" ]- M" v8 u l$ X
, B* ~3 ]6 J# H7 ^& J" }5 u4 J ByteBuffer buffer = ByteBuffer.allocate(bytes.length);. _( |# k3 W6 X I/ X
7 f* K( D# v# L0 S* X9 z1 ]! m; G' I
int i = 0;
$ r# `: }1 H9 N/ p C1 N) Y) v3 P7 Y
+ }! g; C- I l9 p8 } d while (i < bytes.length) {
! _. D; C: J9 |9 S/ g- ?. A6 w/ R5 j# K" z& }" f$ }7 I. f
* g8 |& a$ D7 E5 d# y1 f short b = bytes;5 R/ f: V3 |2 Q F
! E1 @1 f+ V: ^0 n! `' O
& b; D) d0 N, S b: U if (b > 0) {
! \/ q f' _: `& w
% K6 i! k7 ?7 k9 l) ` I/ E' s! H: f$ A" H
buffer.put(bytes[i++]);: {4 x4 U7 D, f2 K- y3 J; c4 R0 F
* |& O0 \. R: K/ Q& B- k
* T3 ]! d- Z6 W9 a
continue;0 G) R/ I5 A, [, C1 R! ]( ~9 k
( @% k1 r! F. q
; ]- t# H3 R& S4 y }
: `% w: ^4 r/ j" N V
- P q }) z3 ~
7 X3 S- F4 i, v/ h h! s' {, S b += 256;# X9 `0 A4 M9 ~0 @. S9 E
9 k g, x( G. [1 o: t: o) ]
1 J1 I6 i, W* c if ((b ^ 0xC0) >> 4 == 0) {& C+ ^3 ]9 E' z: a% D1 Y6 A" x
* L H8 S8 }! ]2 S$ W h
- m& I' `' v# o, ] buffer.put(bytes, i, 2);
3 y6 H8 D# Z* ]7 ?) y
9 w. h. U k5 D2 p( W! `' S
- z4 }. m: g* V9 ]' }5 T2 k i += 2;% `- G$ Q7 G3 h' }9 v( b
% h, v7 }+ ?: H8 e% e
3 _0 ^4 e' D6 {1 V6 h% p9 a }
3 [5 P$ c U, M5 O6 e( |" C9 `; \/ L
1 K+ O6 a8 L+ A" _) h2 B) f5 w7 L
" x2 a5 c$ T( C4 f2 d else if ((b ^ 0xE0) >> 4 == 0) {
, i# Z# m1 A4 k% g3 V& M! `: D) R
! d. u5 f: p. ~/ X; g buffer.put(bytes, i, 3);
8 ~+ J/ G3 g% p4 y, B ~/ J3 H3 s
4 Q* P# b0 E. b) B2 D
0 C" @) c9 x- J" |6 b- g i += 3;, V- z- Z2 F1 z5 K z- e
; c% [+ W1 Z( h8 E- c! X
! V* x1 V- r6 z* K5 v }
: n- y4 E0 u6 p; W9 c5 C9 F
# F1 o# b u5 S* e5 A2 G; a/ N0 b+ d& p9 E% [
else if ((b ^ 0xF0) >> 4 == 0) {" t7 L- J( A2 w# U( N; h% Q) C, @
6 R% f; Z9 ]5 y+ z5 ^8 g# B
# h7 H F2 A% y; P$ q i += 4;# M* j& E9 l, Z2 Z
$ Q e' B/ k1 W
d6 n5 l$ x+ b$ G/ M% L. T, D }- }4 ^7 i: C7 o
// 添加处理如b的指为-48等情况出现的死循环
1 I6 F6 V$ G# A7 O: D" F else {
' e: J9 d& |" M8 | buffer.put(bytes[i++]);
5 M" c* B7 S- j8 ^& ~# w/ }# V
1 x& Y. \9 s5 ?0 E1 `4 m# O& ]2 w
. W) b' y& J% k2 o$ { continue;8 t0 o0 P9 O c& ^# ~
}
/ W; L) m8 P! t& l# \9 a% W
% ]( m9 m% o8 K% m5 m- G+ E. b0 b y8 o" V
}
2 b8 q# r4 B. k9 G$ C) Y" R7 D
; N: _& a, ?" ^& \/ W; J
buffer.flip();0 A C& f& d6 l
% M2 ^6 D$ d2 ]8 L5 H6 ]6 A
; I8 L& c, t9 d E' s* u return new String(buffer.array(), "utf-8");# e, o) m/ L, H [" A E
}
7 n# U+ |$ P. Y4 j1 R* {
$ j2 R, u/ B! D0 a' y7 c$ Z9 G% X9 D5 @- z% V: W
}
3 F7 H V% t& F" U& ~' }# P i" a, f) _* g5 v$ |8 [
: P% I" W4 G. c* n9 |" j2 l
|
|