首页 > 后端开发 > 正文

在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?

2024-07-23 16:54:19 | 我爱编程网

在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?很多朋友对这方面很关心,我爱编程网整理了相关文章,供大家参考,一起来看一下吧!

本文目录一览:

在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?

php对gb编码动态转utf-8编码的几种方法评测


在《IP地址-地理位置转换的测评》一文中提到用ip2addr函数直接读取IP数据库文件是效率最高的,相比用MySQL数据库存储IP数据,用SQL查询是效率最低的。但是IP数据库文件QQWry.dat是GB2312编码的。现在我需要UTF-8编码的地理位置结果。如果用MySQL方法,可以在数据存入数据库时就转换为UTF-8编码,一劳永逸。但是QQWry.dat文件又无法修改,只能把ip2addr函数的输出结果再进行动态转换。
动态转换GB-UTF-8编码至少有四种方法:
用PHP的iconv扩展转换
用PHP的mb_string扩展转换
用对换表转换,对换表存储在MySQL数据库中
用对换表转换,对换表存储在文本文件中
前两种方法要服务器作了相应设置(编译安装了相应扩展)才能使用。我的虚拟主机没有这两个扩展,只好考虑后两种方法。前两个方法本文也不进行测评。
测评程序如下(func_ip.php参见《IP地址-地理位置转换的测评》一文):
?php
require_once ("func_ip.php");
function u2utf8($c) {
$str = "";
if ($c
0x80) {
$str .= $c;
} elseif ($c
0x800) {
$str .= chr(0xC0 | $c
6);
$str .= chr(0x80 | $c
0x3F);
} elseif ($c
0x10000) {
$str .= chr(0xE0 | $c
12);
$str .= chr(0x80 | $c
6
0x3F);
$str .= chr(0x80 | $c
0x3F);
} elseif ($c
0x200000) {
$str .= chr(0xF0 | $c
18);
$str .= chr(0x80 | $c
12
0x3F);
$str .= chr(0x80 | $c
6
0x3F);
$str .= chr(0x80 | $c
0x3F);
}
return $str;
}
function GB2UTF8_SQL($strGB) {
if (!trim($strGB)) return $strGB;
$strRet = "";
$intLen = strlen($strGB);
for ($i = 0; $i
$intLen; $i++) {
if (ord($strGB{$i})
127) {
$strCurr = substr($strGB, $i, 2);
$intGB = hexdec(bin2hex($strCurr)) - 0x8080;
$strSql = "SELECT code_unicode FROM nnstats_gb_unicode
WHERE code_gb = ".$intGB." LIMIT 1"
;
$resResult = mysql_query($strSql);
if ($arrCode = mysql_fetch_array($resResult)) $strRet .= u2utf8($arrCode["code_unicode"]);
else $strRet .= "??";
$i++;
} else {
$strRet .= $strGB{$i};
}
}
return $strRet;
}
function GB2UTF8_FILE($strGB) {
if (!trim($strGB)) return $strGB;
$arrLines = file("gb_unicode.txt");
foreach ($arrLines as $strLine) {
$arrCodeTable[hexdec(substr($strLine, 0, 6))] = hexdec(substr($strLine, 7, 6));
}
$strRet = "";
$intLen = strlen($strGB);
for ($i = 0; $i
$intLen; $i++) {
if (ord($strGB{$i})
127) {
$strCurr = substr($strGB, $i, 2);
$intGB = hexdec(bin2hex($strCurr)) - 0x8080;
if ($arrCodeTable[$intGB]) $strRet .= u2utf8($arrCodeTable[$intGB]);
else $strRet .= "??";
$i++;
} else {
$strRet .= $strGB{$i};
}
}
return $strRet;
}
function EncodeIp($strDotquadIp) {
$arrIpSep = explode('.', $strDotquadIp);
if (count($arrIpSep) != 4) return 0;
$intIp = 0;
foreach ($arrIpSep as $k = $v) $intIp += (int)$v * pow(256, 3 - $k);
return $intIp;
//return sprintf('%02x%02x%02x%02x', $arrIpSep[0], $arrIpSep[1], $arrIpSep[2], $arrIpSep[3]);
}
function GetMicroTime() {
list($msec, $sec) = explode(" ", microtime());
return ((double)$msec + (double)$sec);
}
for ($i = 0; $i
100; $i++) { // 随机产生100个ip地址
$strIp = mt_rand(0, 255).".".mt_rand(0, 255).".".mt_rand(0, 255).".".mt_rand(0, 255);
$arrAddr[$i] = ip2addr(EncodeIp($strIp));
}
$resConn = mysql_connect("localhost", "netnest", "netnest");
mysql_select_db("test");
// 测评MySQL查询的编码转换
$dblTimeStart = GetMicroTime();
for ($i = 0; $i
100; $i++) {
$strUTF8Region = GB2UTF8_SQL($arrAddr[$i]["region"]);
$strUTF8Address = GB2UTF8_SQL($arrAddr[$i]["address"]);
}
$dblTimeDuration = GetMicroTime() - $dblTimeStart;
// 测评结束并输出结果
echo $dblTimeDuration; echo " ";
// 测评文本文件查询的编码转换
$dblTimeStart = GetMicroTime();
for ($i = 0; $i
100; $i++) {
$strUTF8Region = GB2UTF8_FILE($arrAddr[$i]["region"]);
$strUTF8Address = GB2UTF8_FILE($arrAddr[$i]["address"]);
}
$dblTimeDuration = GetMicroTime() - $dblTimeStart;
// 测评结束并输出结果
echo $dblTimeDuration; echo " ";
?
测评两次结果(精确到3位小数,单位是秒):
MySQL查询转换:0.112
文本查询转换:10.590
MySQL查询转换:0.099
文本查询转换:10.623
可见这次是MySQL方法遥遥领先于文件查询法。但是现在还不急于使用MySQL方法,因为文本文件方法之所以如此耗时,主要因为它每次转换都要把整个gb_unicode.txt读入内存,而gb_unicode.txt又是文本文件,格式如下:
0x2121 0x3000 # IDEOGRAPHIC SPACE
0x2122 0x3001 # IDEOGRAPHIC COMMA
0x2123 0x3002 # IDEOGRAPHIC FULL STOP
0x2124 0x30FB # KATAKANA MIDDLE DOT
0x2125 0x02C9 # MODIFIER LETTER MACRON (Mandarin Chinese first tone)

0x552A 0x6458 # CJK
0x552B 0x658B # CJK
0x552C 0x5B85 # CJK
0x552D 0x7A84 # CJK

0x777B 0x9F37 # CJK
0x777C 0x9F3D # CJK
0x777D 0x9F3E # CJK
0x777E 0x9F44 # CJK
文本文件效率较低,于是考虑把文本文件转换为二进制文件,然后用折半法查找这个文件,而不需要把整个文件读入内存。文件格式为:文件头2字节,存储记录数;接着一条接一条记录存入文件,每条记录4字节,前2字节对应GB代码,后2字节对应Unicode代码。转换程序如下:
?php
$arrLines = file("gb_unicode.txt");
foreach ($arrLines as $strLine) {
$arrCodeTable[hexdec(substr($strLine, 0, 6))] = hexdec(substr($strLine, 7, 6));
}
ksort($arrCodeTable);
$intCount = count($arrCodeTable);
$strCount = chr($intCount % 256) . chr(floor($intCount / 256));
$fileGBU = fopen("gbu.dat", "wb");
fwrite($fileGBU, $strCount);
foreach ($arrCodeTable as $k = $v) {
$strData = chr($k % 256) . chr(floor($k / 256)) . chr($v % 256) . chr(floor($v / 256));
fwrite($fileGBU, $strData);
}
fclose($fileGBU);
?
执行程序后就获得了二进制的GB-Unicode对照表gbu.dat,并且数据记录按GB代码排了序,便于折半法查找。使用gbu.dat进行转码的函数如下:
function GB2UTF8_FILE1($strGB) {
if (!trim($strGB)) return $strGB;
$fileGBU = fopen("gbu.dat", "rb");
$strBuf = fread($fileGBU, 2);
$intCount = ord($strBuf{0}) + 256 * ord($strBuf{1});
$strRet = "";
$intLen = strlen($strGB);
for ($i = 0; $i
$intLen; $i++) {
if (ord($strGB{$i})
127) {
$strCurr = substr($strGB, $i, 2);
$intGB = hexdec(bin2hex($strCurr)) - 0x8080;
$intStart = 1;
$intEnd = $intCount;
while ($intStart
$intEnd - 1) { // 折半法查找
$intMid = floor(($intStart + $intEnd) / 2);
$intOffset = 2 + 4 * ($intMid - 1);
fseek($fileGBU, $intOffset);
$strBuf = fread($fileGBU, 2);
$intCode = ord($strBuf{0}) + 256 * ord($strBuf{1});
if ($intGB == $intCode) {
$intStart = $intMid;
break;
}
if ($intGB
$intCode) $intStart = $intMid;
else $intEnd = $intMid;
}
$intOffset = 2 + 4 * ($intStart - 1);
fseek($fileGBU, $intOffset);
$strBuf = fread($fileGBU, 2);
$intCode = ord($strBuf{0}) + 256 * ord($strBuf{1});
if ($intGB == $intCode) {
$strBuf = fread($fileGBU, 2);
$intCodeU = ord($strBuf{0}) + 256 * ord($strBuf{1});
$strRet .= u2utf8($intCodeU);
} else {
$strRet .= "??";
}
$i++;
} else {
$strRet .= $strGB{$i};
}
}
return $strRet;
}
把其加到原来的测评程序,对三种方法同时测评2次得到数据(精确到3位小数,单位:秒):
MySQL方法:0.125
文本文件方法:10.873
二进制文件折半法:0.106
MySQL方法:0.102
文本文件方法:10.677
二进制文件折半法:0.092
可见二进制文件折半法还比MySQL法略有优势。但是上述测评都是对短的地理位置进行转码,如果对较长的文本转码又如何呢?我找来5个Blog的RSS 2.0文件,都是GB2312编码。测评三种方法对5个文件编码耗费的时间,2次测量数据如下(精确到3位小数,单位:秒):
MySQL方法:7.206
文本文件方法:0.772
二进制文件折半法:5.022
MySQL方法:7.440
文本文件方法:0.766
二进制文件折半法:5.055
可见对长的文本是用文本文件的方法最优,因为转码对照表读入内存后,转码就可以很高效了。既然如此,我们还可以尝试改进一下,把文本文件方法改为:转码对照表从二进制文件gbu.dat读入内存,而不是文本文件。测评数据如下(精度和单位同上):
从文本文件读入对照表:0.766
从二进制文件读入对照表:0.831
从文本文件读入对照表:0.774
从二进制文件读入对照表:0.833
表明这次改进失败了,从文本文件读入转码对照表更高效。
总结:用PHP对GB编码到UTF-8编码的动态转换,如果每次转换的文本很小,适宜用二进制文件结合折半法转换;如果每次转换的文本较大,适宜用文本文件存储转码对照表,并在转换前一次性把对照表读入内存。

在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?

在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?

用软银版的emoji,如雪人的小图标,“\ue048”\x0d\x0a\x0d\x0a公众号PHP编写的接口文件,回复“\ue048”是不行的。需要转码,\x0d\x0a\x0d\x0a//content\x0d\x0aunicode2utf8("\ue02d");\x0d\x0a\x0d\x0a//转码函数\x0d\x0afunctionunicode2utf8($str){//unicode编码转化,用于显示emoji表情\x0d\x0a$str='{"result_str":"'.$str.'"}';//组合成json格式\x0d\x0a$strarray=json_decode($str,true);//json转换为数组,利用JSON对\uXXXX的支持来把转义符恢复为Unicode字符\x0d\x0areturn$strarray['result_str'];\x0d\x0a}

在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?我爱编程网

php如何输出中文json格式字符串

我爱编程网(https://www.52biancheng.com)小编还为大家带来php如何输出中文json格式字符串的相关内容。

php如何输出中文json格式字符串
如何对json格式的字符串进行转换,php提供了两个函数:
json_encode 对变量进行 JSON 编码
json_decode 对 JSON 格式的字符串进行编码

下面看个实例:
$arr = ['a', 'b', 'c'];echo json_encode($arr);

输出为:
["a","b","c"]

但是,当我们在数组中放入中文的时候,就会出现问题:
$arr = [ '世界', '你好',
];echo json_encode($arr);

输出的结果为:
["\u4e16\u754c","\u4f60\u597d"]

这个结果显然不是我们想要的,但是为什么出现这个呢?
因为当我们的值中包含中文时,php对他进行json编码时底层会对中文进行unicode编码,导致结果不可读,那该怎么解决呢?
方法一
可以利用 urlencode 和 urldecode 方法绕过这个转码为 unicode 的过程,先将中文字段进行urlencode,然后json_encode,最后再用urldecode处理结果,便可以正常显示中文。具体代码如下:
$arr = [ '世界', '你好',
];echo urldecode(json_encode(array_map('urlencode', $arr)));

输出结果为:
["世界","你好"]

方法二
自PHP5.4版本,官方就已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE。加上这个选项后,就不会自动把中文编码了。具体代码如下:
$arr = [ '世界', '你好',
];echo json_encode($arr, JSON_UNESCAPED_UNICODE);
["世界","你好"]

看吧,这才是我们想要的结果 :)

以上就是我爱编程网为大家带来的在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?,希望能帮助到大家!更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“在微信公众平台开发者模式的自动回复里加入emoji表情,需要什么PHP方法来处理?”相关推荐
哪里有JAVA开发板,软件开发平台,Web开发平台或快速开发平台的源码,包括工作流源码,还有JAVA OA源码?
哪里有JAVA开发板,软件开发平台,Web开发平台或快速开发平台的源码,包括工作流源码,还有JAVA OA源码?

初学者想学ARM嵌入式,应该选ARM9还是ARM11开发板?对于ARM嵌入式的初学者,建议用ARM9开发板。首先,从功能上来说,ARM11要比ARM9强一些,但是性能优异并不代表适合初学者。对于初学者来说ARM11的有些功能是冗余。其次,学习ARM9或者ARM11就在所难免学习其所支持的操作系统Linux(ARM11可以支持Android)。目前,市面上ARM9的开发版的价格要比AR

2024-07-03 16:24:53
python自动化入门需要多久?
python自动化入门需要多久?

python自动化入门需要多久?学习看个人基础,从经验来看,有如下建议:如果是自学,从零基础开始学习Python的话,依照每个人理解能力的不同,大致上需要一年半左右的时间,至于能不能学好要看你自己的领悟了,至于找到工作那就不好说了。一切要看你学的效果。当然,如果有其它编程语言的经验,入门还是非常快的,大概需要2~3个月可以对上手Python语言编写一些简单的应用。无论是新

2024-02-29 08:41:52
微信小程序做一个需要多少钱?
微信小程序做一个需要多少钱?

微信小程序做一个需要多少钱?做一个微信小程序通常需要几百到几万不等。如今微信小程序越来越流行,许多商家都想通过微信小程序来吸引顾客,提高收入,但是许多人不知道制作微信小程序这个过程需要花费多少钱,从而有些不敢尝试。制作小程序需要花多少钱,通常和以下几个因素有关,这些因素决定了需要多少的花费。1、功能功能是影响小程序开发价格的重要因素之一,小程序包含的功能越多,费用也就越高,所以具

2024-06-27 13:07:45
php正则表达式函数 超常用的PHP正则表达式收集整理
php正则表达式函数 超常用的PHP正则表达式收集整理

超常用的PHP正则表达式收集整理以下就是对超常用的PHP正则表达式进行的收集整理,为了方便大家更快更好的掌握php正则表达式。一、表单验证匹配验证账号,字母开头,允许5-16字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$验证账号,不能为空,不能有空格,只能是英文字母:^\S+[a-zA-Z]$验证账号,不能有空格,不能非数字:^

2024-07-15 12:34:10
主要的JAVA平台有哪些
主要的JAVA平台有哪些

主要的JAVA平台有哪些什么叫主要的Java平台呢,下面这是三个主要的平台。JavaEE面向企业应用,JavaSE面向桌面应用JavaME面向移动设备。上面有人提到的是开发用的集成开发环境,简称IDE(IntegratedDevelopmentEnvironment)目前流行的主要有:Eclipse:开源的,插件很多;有很多其他著名IDE,如Workshop,Web

2024-06-30 18:22:12
php 怎么处理字符串
php 怎么处理字符串

php怎么处理字符串大家通过对PHP的学习,可以运用这一高级语言创建一个性能较高的网站。对于初学者来说,对于PHP字符串mbstring还是比较陌生的,下面我们就来介绍一下PHP字符串mbstring的具体应用。多国语言并存就意味着多字节,PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字

2024-07-23 12:33:53
请问python后端开发一般需要什么技术?
请问python后端开发一般需要什么技术?

请问python后端开发一般需要什么技术?第一阶段:Python语言基础主要学习Python最基础知识,如Python3、数据类型、字符串、函数、类、文件操作等。阶段课程结束后,学员需要完成Pygame实战飞机大战、2048等项目。第二阶段:Python语言高级主要学习Python库、正则表达式、进程线程、爬虫、遍历以及MySQL数据库。第三阶段:Pythonweb

2024-01-20 06:43:40
Python开发要学哪些内容_python开发需要掌握哪些知识
Python开发要学哪些内容_python开发需要掌握哪些知识

Python开发要学哪些内容_python开发需要掌握哪些知识可以按照以下课程大纲学习:阶段一:Python开发基础Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。阶段二:Python高级编程和数据库开发Python全栈开发与人工智能之Python高

2024-02-04 00:30:46