方法1:base_encode64

這種方法是可以,但是舊數據沒有經過encode操作,取數據的時候如果統一進行decode的話,舊數據會丟失的。

1

方法2:urlencode

這個似乎可以,對沒有經過encode的數據進行decode也不會有影響,而且多次decode似乎也不會有影響。你們說這個方法有缺陷嗎?

=======================

一個發現,微信獲取用戶基本信息的時候,笑哭那個表情print_r出的是\ud83d\ude02,而我存儲的時候,報錯說這個 \xF0\x9F\x98\x82 值不能存儲,請問這是怎么回事,自動轉碼了,轉成的這是什么?是微信轉碼過了嗎?

=======================

方法3:采用了下面采納的那個方法,因為我覺得它有下面幾個優點:

1、那個方法只轉換表情,不會轉換中文,所以數據還是直接可讀的 數據庫中存儲起來是這樣的,如何轉義emoji表情,讓它可以存入utf8的數據庫 后面的\ud83d\udca5可以隨意復制粘貼,而顯示出來是這樣的, 如何轉義emoji表情,讓它可以存入utf8的數據庫 2、不會把表情轉換為其它標准,只有一個簡單的,固定的轉換算法,也就是說不需要一個表情庫來對照着轉換,所以以后其它人要使用這個數據的時候,也很容易知道每個表情是對應的哪個。就算蘋果大爺又增加了表情,也不需要做什么額外的修改。 3、可以無限decode輸出的都是正確的內容。因為有的時候可能需要在一次請求中的兩個地方做decode,其它decode多次會把正確的數據改成其它數據,這個不會。 缺點: 1、看了下面的代碼就知道,這個是強制修改字符編碼中,指定區間內的編碼,也就說有可能誤殺,也有可能有超出這個區間的emoji沒殺到。不過僅僅是在字符前加反斜杠,即使誤殺了,發現之后也很容易改回來。 數據庫中發現有這樣的 ,是漏殺了,但是不知道為什么,這個可以直接存數據庫。 /** 把用戶輸入的文本轉義(主要針對特殊符號和emoji表情) */ function userTextEncode($str){ if(!is_string($str))return $str; if(!$str || $str=='undefined')return ''; $text = json_encode($str); //暴露出unicode $text = preg_replace_callback("/(\\\u[ed][0-9a-f]{3})/i",function($str){ return addslashes($str[0]); },$text); //將emoji的unicode留下,其他不動,這里的正則比原答案增加了d,因為我發現我很多emoji實際上是\ud開頭的,反而暫時沒發現有\ue開頭。 return json_decode($text); } /** 解碼上面的轉義 */ function userTextDecode($str){ $text = json_encode($str); //暴露出unicode $text = preg_replace_callback('/\\\\\\\\/i',function($str){ return '\\'; },$text); //將兩條斜杠變成一條,其他不動 return json_decode($text); } //處理名字的emoji符號 $tmpStr = json_encode($text); //暴露出unicode $tmpStr = preg_replace("#(\\\ue[0-9a-f]{3})#ie","addslashes('\\1')",$tmpStr); //將emoji的unicode留下,其他不動 $text = json_decode($tmpStr); return $text;

方法4: 一個標准的解決方案:

1、mysql的版本必須為v5.5.3或更高 2、把數據庫的編碼改成utf8mb4 -- UTF-8 Unicode 3、然后需要存儲emoji表情的字段選擇utf8mb4_general_ci 4、數據庫連接也需要改為utf8mb4 設置完成后,應該可以看到如下類似字符集設置結果。那么可以直接的存入數據庫,無需做任何額外的事情了。 mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ 我在做微信公眾平台開發時遇到過這個問題,微信用戶的昵稱可以包含表情(坑爹- -!)。於是我就將整個昵稱轉換成HEX字符串存在MySQL中,目前用戶1W+,系統穩定,題主可以參考一下此方案。 MySQL支持hex() and unhex()函數。Java可以使用org.apache.commons.codec.binary.Hex工具類。其他語言也有相應的方法。 ![這里寫圖片描述](https://img-blog.csdn.net/20160612155302911) 試試微博或qq里面的那種方式?用簡單的編碼來映射,比如微笑可以用 [wx] 或 /wx 。不過表情多了之后4個字符不怎么夠用。。。 urldecode 我看了一下 decode 的源碼,應該是不會出現問題。 只要沒有 % 解碼后肯定還是原來的字符(串),有 % 會出現兩種情況,一種是解碼成功,這個時候肯定就不是原來的字符串了,一種是解碼失敗,拋出異常(其實這個異常可以作為是否 encode的標准)。 解碼還算是比較嚴格吧,作為用戶名的情況下 出現 % 還解碼成功的概率比較小吧,對於這部分你可以手動改數據庫,應該不會有很多。 你試試這個函數,之前弄微信自定義菜單的時候,也接觸過Emoji表情,當時看到用的這個函數把Emoji表情的編碼給轉換了。 function utf8_bytes($cp) { if ($cp > 0x10000){ # 4 bytes return chr(0xF0 | (($cp & 0x1C0000) >> 18)). chr(0x80 | (($cp & 0x3F000) >> 12)). chr(0x80 | (($cp & 0xFC0) >> 6)). chr(0x80 | ($cp & 0x3F)); }else if ($cp > 0x800){ # 3 bytes return chr(0xE0 | (($cp & 0xF000) >> 12)). chr(0x80 | (($cp & 0xFC0) >> 6)). chr(0x80 | ($cp & 0x3F)); }else if ($cp > 0x80){ # 2 bytes return chr(0xC0 | (($cp & 0x7C0) >> 6)). chr(0x80 | ($cp & 0x3F)); }else{ # 1 byte return chr($cp); } } 我這個剛解決的這個問題(后端是java實現的,數據庫Mysql),供參考。 1、修改存儲emoji字段編碼,例如放在username字段中: ALTER TABLE user CHANGE username username VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci default null; 2、java在執行數據庫插入、更新操作前,要先執行 sql語句"set names utf8mb4" 語句。 使用BOLO類型 將數據庫編碼改為 utf8mb4 https://github.com/iamcal/php-emoji 我是用這個處理的~ http://www.emoji-cheat-sheet.com/ 有一種編碼叫 utfmb4,支持 4 位長度的 utf8 編碼 喏,你的 MySQL 版本必須為 5.5 以上的 不用轉,直接數據庫轉成utf8mb4, 我以前就是這么干的 不用更改整個數據庫的把。。。create xxx() charset=utf8mb4 單表 utf8mb4就行了把 因為我的項目中需要對字數有限制的需求,涉及到逐字計數,在這基礎上我增加了emoji的功能完美實現。你需要代碼的話請再告訴我,我提供給你。

方法5 干掉emoji表情

emoji表情是個麻煩的東西,即使你能存儲,也不一定能完美顯示。在iOS以外的平台上,例如PC或者android。如果你需要顯示emoji,就得准備一大堆emoji圖片並使用第三方前端類庫才行。即便如此,還是可能因為emoji圖片不夠全而出現無法顯示的情況

在大多數業務場景下,emoji也不是非要不可的。我們可以適當地考慮干掉它,節約各種成本

經過一番苦苦的google,終於找到靠譜能用的代碼:

// 過濾掉emoji表情

function filterEmoji(str)

{str)  {str = preg_replace_callback(

‘/./u’,

function (array match)returnstrlen($match[0])>=4?′′:$match[0];,match)returnstrlen($match[0])>=4?″:$match[0];,str);

return $str;

}

php 将表情存入数据库,php + mysql 存入表情 【如何轉義emoji表情,讓它可以存入utf8的數據庫】...相关推荐

  1. solr 4.8 mysql_solr 4.8+mysql數據庫數據導入 + mmseg4j中文全文索引 配置筆記

    1.如何將solr部署,請參考之前的文章 2.按上述配置好后,在solr_home文件夾中,將包含collection1文件夾,這就是solr的一個實例.下面我們來看看collection1中的文件內 ...

  2. mysql數據庫的增刪改查_MySQL數據庫之基礎增刪改查操作

    作者:        守望幸福 最后修改日期:2014-7-27 所操作的MySQL數據庫名:firstdb 所用的兩個表結構如下: student表 number name socre born_d ...

  3. jpa oracle mysql,JPA-Oracle-Mysql連接數據庫配置

    //...省略datasouce class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" ...

  4. mysql使用从c3p0_使用c3p0連接池操作mysql數據庫中文亂碼解決辦法

    今天在一台新的CentOS機器上使用c3p0連接池操作mysql數據庫出現中文亂碼問題,具體表現為:查詢時無中文亂碼問題,寫數據時中文亂碼,查看了機器上數據庫字符集也是UTF8,應該不會出現中文亂碼才 ...

  5. 數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)

    ORACLE數據庫轉MySQL數據庫遇到的坑 總結 最近在做Oracle轉mysql的工程,遇到的坑是真的多,尤其是存儲過程,以前都沒接觸過類似的知識,最近也差不多轉完了就總結一下.希望能幫到一些人( ...

  6. mysql不能存字母,使用不常見的字母/符號時,MySql數據庫不能正確存儲數據

    I have a simple form that sends (via php) some variables to a mySql database. 我有一個簡單的表單,通過PHP發送一些變量到 ...

  7. python3.5 连接mysql_python3.5 連接mysql本地數據庫

    前期准備工作: 安裝python的模塊,網上大部分讓安裝mysqldb模塊,但是會報錯,原因是python3.5不被其支持: 請看該鏈接 我們也可以這樣解決: 直接執行:sudo pip3 insta ...

  8. emoji表情无法显示在html,微信分享页面Andriod手机emoji表情符无法显示问题?

    分享页面中有用户名和评论信息,用户名和评论信息中都有emoji表情.在苹果手机上用户名和评论中的emoji表情都能显示,但是在Andriod手机上用户名如果有emoji表情则不能显示.在手机自带浏览器 ...

  9. mdf ldf 转mysql_如何將sql server 的.mdf和.ldf 數據備份文件導入到mysql數據庫中?

    示例 下面的示例將 pubs 中的兩個文件附加到當前服務器. EXEC sp_attach_db @dbname = N'pubs', @filename1 = N'c:\Program Files\ ...

最新文章

  1. 平台电商类的增长策略:从用户激励到养成类游戏
  2. 函数定义、函数参数、跨脚本调用函数
  3. 【ArcGIS Pro微课1000例】0012:ArcGIS Pro属性表中文乱码完美解决办法汇总
  4. php正规则表达式学习笔记(几个常用函数的区别)
  5. 华为鸿蒙系统学习笔记9-华为鸿蒙OS与LiteOS对比
  6. python库发布之从零到一:发布自己的第一个库——blogdownloader
  7. .NET下多线程初探
  8. 机器学习算法之KNN算法
  9. JGit、SvnKit - 版本提交日志(1)提取
  10. AutoCAD2016-2020设置经典模式界面
  11. 图书管理系统数据库设计
  12. 创业过程中技术真的那么重要吗
  13. Linux键盘输入读取
  14. 4TB的移动硬盘,显示只有1.63TB
  15. IOS微信后台运行时候倒计时暂停问题
  16. java结构体构建学生 学号_(1)定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩; 急求...
  17. 利用VBA在Word中排出漂亮的代码
  18. c语言编程文件的加密解密,C语言实现任何文件的加密解密功能
  19. 主機名稱控制者: DNS 伺服器
  20. office2007版本信息

热门文章

  1. 国际码可以直接应用于计算机,2012年自考计算机应用基础试题及答案
  2. 2017.9.13 序列维护 思考记录
  3. 2017.8.7 数学作业 思考记录
  4. 一、Arcgis api js -- 基本概念
  5. 在vscode运行js 输出会合并_前端系列——JS的运行与输出
  6. java final修改器_Java中的“ final”关键字如何工作?(我仍然可以修改对象。)...
  7. 常见问题_自动打螺丝机常见问题及解决办法
  8. r语言回归分析_R语言之cox回归分析
  9. Compact Normal Storage for Small G-Buffers
  10. 备份Linux系统的数据到坚果云