|
在开发中发现有些特殊的字符无法正常存到mysql数据库中,列如qq昵称中加入苹果手机中的表情就导致无法正常保存,后来查了一下原因:mysql数据库是可以支持4字节的utf8字符的,不过大部分情况,这个选项是没有打开的,已创建的数据库也不可以更改,所以,在这种情况下,只好把4字节的utf8字符过滤掉,而汉字是3字节的utf8字符,不影响汉字部分,最后终于找到了一个解决的办法,但是办法虽然找到了却发现自己对于java基础知识掌握的还是不深刻的,列如16进制、异或运算等等,都是我们最初在学校学习java的知识,但是现在终于看到了他的重要性了。java论坛5 |6 z' d8 K6 l W
- U+ M0 U8 r7 H/ D1 _* l7 J; n* g( W' f U$ ^
import java.io.UnsupportedEncodingException;! r7 }4 u3 i* @3 t
import java.nio.ByteBuffer;) _7 | b( c/ V! q" \$ r7 C
$ S! O# p9 U6 t$ | r/ ^" L# E1 k! K- L7 J! V
public class Test {2 U- F: w1 X, J
$ h9 v+ D# H8 j" H) @
& u/ i' x! W& r8 O public static void main(String[] args) throws UnsupportedEncodingException {
" G# T) k, R& B) G String nickName = "得😩得得😩";/ u; \4 v1 ]' W3 j
System.out.println(filterOffUtf8Mb4(nickName));, u5 U; J$ B; o. j6 a/ w: U
}
3 u, |" G; L7 o" ^7 W P) L& n) m4 P' c \
& d* K: e* Q- r5 e1 D public static String filterOffUtf8Mb4(String text)+ |, l/ h1 [7 Y! q
throws UnsupportedEncodingException {
1 V: w$ W$ J; t4 M
1 U1 @) M; v k& r0 C
9 \$ Y7 B( l* c& i% Z! A, S byte[] bytes = text.getBytes("utf-8");- Q, w5 l. R2 y7 A& z8 W' `6 B# s
: h, n! [, A Z. K- \( A4 U
" c! E+ F- H; q% h- W ByteBuffer buffer = ByteBuffer.allocate(bytes.length);4 c$ }* w/ R1 Y5 i5 m4 c
. G6 I2 X* G) o, T" o) K+ J, P! i, B9 w) l2 k+ z5 H# F" ~: N
int i = 0;
* e1 ^7 s- o; \6 W6 {- [: b2 i7 g& Z# s+ h3 R
$ A6 ~; m; z3 t' ]- }0 K
while (i < bytes.length) {. H8 c' q r9 S$ n" c3 r
/ v& F% m# c6 w- i2 M& z
! v) m8 v6 f1 d2 a) v5 ^ short b = bytes;
* A; s: h! d' ?0 _$ r! b
1 U- O2 F' P8 h6 k. Z4 `2 M* k
. e4 g6 ~+ L/ q) O: l1 ? if (b > 0) {
. E5 v k9 w8 L0 b( o
1 X# B; A9 D L- x) [
Z. ~0 l0 G$ o, u buffer.put(bytes[i++]);
; S/ E# B$ l; H" \; X* i1 |: b* P/ w7 @8 D& M- A
& @2 ^+ }) U. ?! A
continue;
2 X {, V! E8 X/ }' x- U+ A/ s' j, e3 ~5 T9 s: T# t8 }& S. W
3 ]6 A; ? c$ Y a
}
8 \' q0 ?0 U, ?1 a) W$ _
n4 e- f' z1 Z. G* |% w M
# G; ^6 G4 H) ?8 n; S b += 256;
* [' }/ v( ~0 @! j( X3 l$ J5 V# I0 m$ y* V
3 `0 N+ E( h8 G, @7 d6 j( D8 C, o if ((b ^ 0xC0) >> 4 == 0) {
7 `2 e* @( Z# J. q+ A$ K4 t) j2 `3 O0 V `2 [$ n
6 [" `* p8 l. v* Q) k9 H buffer.put(bytes, i, 2);/ F% \. I; V/ k& L
f* ]* \8 b9 p1 ]4 o8 }! Y; e& ~/ H% L. k
i += 2;
1 ~# n# o- C& z" A% P1 Q! `6 b6 j# c0 n1 }& \
+ b7 ^4 l# e! ?( j }* p+ G' k, J4 B2 h- I) L9 V6 p& E
4 k0 s0 z: e C) E( {8 y$ [; S: v% [) l. [! g O, ]- J. Z1 Z
else if ((b ^ 0xE0) >> 4 == 0) {
@4 ?, Z7 a2 b+ Y# I; x. F) V( ?1 x$ p$ e6 ?6 ~, S8 H2 R# n9 ?
% i2 c/ a4 j' {% `/ t buffer.put(bytes, i, 3);* i% Y. E$ R8 \
1 x- p) J: x5 Q f! }( [: f- l3 q- v% C/ Z
i += 3;
" k2 d/ }" z0 Q
3 |" s, w/ C% y. z' m
2 r/ n3 Y$ v8 k! ` }
6 f ~9 a/ _7 U" h# J# T& E8 g- P+ b/ k. I1 S
0 F' |* y$ g6 X7 K7 V$ H else if ((b ^ 0xF0) >> 4 == 0) {
4 m- _' Q' G s& Q/ `* Y2 V: t4 C( t, k$ j; Q
( \) ~- s# I+ r. @4 Z# l
i += 4;) K- Y {8 R; V( ]* w
. ]1 B2 ]+ l* N% ?" V0 n
( }9 a* ]" N; E0 n$ [9 r }5 w" U% H) @* l, p6 W7 e
// 添加处理如b的指为-48等情况出现的死循环3 E+ T. ]9 B" q* t# G
else {
- E: Z T! P. r( E buffer.put(bytes[i++]);) K# ]9 f8 o1 _% I# k2 z! S
5 l$ ]. q) H1 D1 P& p' u0 N
/ t" P4 v* K2 H# S continue;! b8 @; G: H) L: k' N/ y. L
}+ h/ C) l$ P M) H
; G J1 M9 }0 P0 V8 r$ i& J' b, X# d7 }% I, ]8 I' v, P% g: F
}
8 P- |/ m; s2 F( ?3 u" L; ~8 X. \* B S5 N
6 G$ @) K$ Y1 I2 ]4 ^! T
buffer.flip();) L. }4 X) k0 g: P2 ^
/ ?( f8 l- q9 S7 U1 f1 w
5 ^2 B, _, M& D5 o" d6 B( [% [ return new String(buffer.array(), "utf-8");
5 m; J& j) h2 K" `3 m }
) @6 u7 \" F8 \; P: Z: |' D, D. _2 u% v5 i2 ?3 [
1 s8 I3 @! N8 f* t# A. ?7 y% ^6 l+ ^
}
# s6 [8 D$ P3 l5 |1 ?% n- C6 ]7 S- z
$ v5 W g% ?2 q. {, i
|
|