日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【MySQL】存儲(chǔ)emoji表情報(bào)錯(cuò)(Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...')的解決方案

 印度阿三17 2019-04-24
Emoji表情字符現(xiàn)在在APP已經(jīng)廣泛支持了。但是MySQL的UTF8編碼對(duì)Emoji字符的支持卻不是那么好。所以我們經(jīng)常會(huì)遇到這樣的異常: ? Java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1 1 原因是Mysql里UTF8編碼最多只能支持3個(gè)字節(jié),而Emoji表情字符使用的UTF8編碼,很多都是4個(gè)字節(jié),有些甚至是6個(gè)字節(jié)。 ? 解決的方案有兩種: ? 使用utf8mb4的mysql編碼來(lái)容納這些字符。 過(guò)濾掉這些特殊的表情字符。 方法1:使用utf8mb4的mysql編碼來(lái)容納這些字符 注意:要使用utf8mb4類型,首先要保證Mysql版本要不低于 MySQL 5.5.3。 ? 第一步:在mysql的安裝目錄下找到my.ini,作如下修改 ? [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' ? 修改后重啟Mysql ? 第二步:將已經(jīng)建好的表也轉(zhuǎn)換成utf8mb4 ? alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; 1 將TABLE_NAME替換成你的表名。然后就OK了。 網(wǎng)上流傳的一個(gè)版本增加了一個(gè)步驟,就是以root身份登錄Mysql,修改環(huán)境變量,將 ? character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server 1 都修改成utf8mb4。不過(guò)我沒(méi)有做這一步,也正常,所以可能是這一步是多余的。 ? 方法2:過(guò)濾掉這些特殊的字符 import org.apache.commons.lang.StringUtils; ? public class charUtil { ????/** ?????* 替換四個(gè)字節(jié)的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解決方案 ?? ?????*/ ????public static String removeFourChar(String content) { ????????byte[] conbyte = content.getBytes(); ????????for (int i = 0; i < conbyte.length; i ) { ????????????if ((conbyte[i] & 0xF8) == 0xF0) { ????????????????for (int j = 0; j < 4; j ) { ????????????????????conbyte[i j] = 0x30;// 0x30 int=48???字符=0 ????????????????} ????????????????i = 3; ????????????} ????????} ????????content = new String(conbyte); ????????return content.replaceAll("0000", ""); ????} ? ????/** ?????* 將emoji表情替換成* ?????* @return 過(guò)濾后的字符串 ?????* 過(guò)濾的方式很簡(jiǎn)單,直接使用正則表達(dá)式匹配編碼范圍,然后替換就行了。 ?????*/ ????public static String filterEmoji(String source) { ????????if (StringUtils.isNotBlank(source)) { ????????????return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"); ????????} else { ????????????return source; ????????} ????} ? ????public static void main(String[] arg) { ????????try { ????????????System.err.println("測(cè)試->將emoji表情替換成*"); ????????????String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 "; ????????????System.out.println(text); ????????????System.out.println(text.length()); ????????????System.out.println(text.replaceAll("[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]", "*")); ????????????System.out.println(filterEmoji(text)); ????????????//輸出結(jié)果 ????????????//This is a smiley ?? face?? ?? ?? ?? ?? ?? ?? ????????????//45 ????????????//This is a smiley * face?? ?? ?? ?? ?? ?? ?? ????????????//This is a smiley * face* * * * * * * ? ????????????System.err.println("測(cè)試->替換四個(gè)字節(jié)的字符 '\\xF0\\x9F\\x98\\x84\\xF0\\x9F)的解決方案 ??"); ????????????String title = "ff的范德薩分????????Llfldakf;dsk。f????????????daslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k"; ????????????System.out.println(removeFourChar(title)); ????????????//輸出結(jié)果:ff的范德薩分Llfldakf;dsk。fdaslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k ? ????????} catch (Exception ex) { ????????????ex.printStackTrace(); ????????} ????} }來(lái)源:http://www./content-2-172551.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多