[edm]搭建自己的邮件服务器后,可以群发大量邮件(一秒发一个)吗?

2015年12月22日星期二 | | 0 评论 |

[edm]搭建自己的邮件服务器后,可以群发大量邮件(一秒发一个)吗?
在服务器上和在个人电脑上都可以搭建吗?搭建的邮件服务器能被其他服务器识别吗?比如能从QQ邮箱发送到我们的邮件服务器吗?

自己建服务器的话就属于玩bulk mailing了。
其实要玩bulk mailing玩出快感的话,就是要一个一个ISP的研究。
10个能搞定3个的时候就可以小high了,搞定5个就可以大high了。

作者:李宇光

搭建自己的邮件服务器后,可以群发大量邮件(一秒发一个)吗?

取决于你发给谁, 如果发给自己服务器的用户,理论上在服务器没爆之前,每秒发多少都可以。 如果是发给qq,163,189,139,sina这些,呵呵,一般来说最多能让你发几百封,然后你的服务器ip会被永久列黑。(当然,如果是完全正常的邮件,正常用户发送的除外)

在服务器上和在个人电脑上都可以搭建吗?
完全可以

搭建的邮件服务器能被其他服务器识别吗?
首先你需要有个域名 (@后面那个),其次你的服务器发送ip要有ptr记录指向你的域名,第三你的域名要有mx记录。 这样别人就知道你是谁了,从QQ邮箱发送到你的邮件服务器就是可以的了。

以上名词不懂的话可以自行百度。
最后作为邮件运营商从业者友情提示一下,不要以为有服务器就能发大量营销(垃圾)邮件。 =。=
-----------
知乎用户,系统架构师,渗透狗,EDM专家
1、首先你需要一个域名,配置MX记录,让别人可以识别你。 
2、其次你需要本地配置邮件服务器,可以接收发送邮件到指定HELO域。
3、然后你需要配置正确对应的域名信息,这样可以正常收发。
4、下一步你需要写的SPF记录,让邮件服务器认识你。
5、配置域名和IP的PTR,让路由器认识你服务器和域名
6、当然以上配置好了,你必须有个固定公网IP,而非虚拟IP或者动态地址
7、去大的SPAM LIST组织移除自己IP,确保通信不被直接丢弃
8、如果要大批量发送给大的服务商,那么你需要很多IP,如果只有一个,你需要知道对方的BLOCK POLICY。测试好阀值
9、QQ可以申请它域互通,网易有诚信邮,可以申请备案的都去申请
10、现在开始你可以尝试开始群发邮件。 
11、内容和标题,页脚需要满足商业群发或机构群发的规则,不然即使备案也会被封

参考: http://www.zhihu.com/question/30383915

[分享]寻找最佳发送时刻—什么时候发送你的邮件活动最合适?

| | 0 评论 |

你应该在想:"什么时候才是发送邮件的最佳时刻?"这要取决于你是谁和你要发给谁了。因为MailChimp的发送时间优化功能是基于电子邮件基因计划里面储存的数十亿条电子邮件地址数据来向用户提供建议的。而这些数据主要是记录了数十亿个邮件地址在接收,打开邮件以及点击链接方面的数据,完全是精确到个体级别的,因此MailChimp给出的发送时间建议完全是根据用户订阅列表上的订阅人的具体情况而定的。

但这并不代表我们不能够从更高的级别去解决这个问题。在这篇文章里,我们将会看一下发送时间优化系统的方法以及解释一下为什么不同的订阅列表会有不同的最佳发送时间。

怎样去解读本文中的图表:我们给每一个收件地址都计算了一个当地的最佳发送时间。"最佳发送时间"是一个计算出来的时间。图表记录了每一个特定最佳发送时间中的电子邮件地址数量所占整体的比例。例如1%邮件地址的最佳发送时刻为早上3点而有6%的邮件地址则为早上9点。在图表中不同的时间加起来的比例总和是100%,因为每一个邮件地址都有其最佳发送时刻。(我会在本文中将发送时间优化系统简称为STO,电子邮件基因计划简称为EGP。)

简单的答案

如果你也跟大多数读者一样,希望能够从更高层面找到什么时刻是最合适发送邮件的简单答案,我将会向你展示EGP中几十亿邮件地址所反映出来的真实情况。为了能让研究结果看起来更简单,我已经将一周分成7天,一天分成好几个时间段来研究。

我们一起看一下一个礼拜中每一天的效果。STO的数据表明,总体来说,工作日是发给大部分订阅人的最佳日子。将周日作为最佳发送日的邮件地址所占比例是最低的,而周一到周五所占的比例都差不多。(译者注:表格订阅人最佳发送日一周比例分布图。)

edm

要知道没有哪一天是有绝对的优势。这也正是我们从数十亿收件箱数据分析中所希望看到的结果。

现在我们已经知道作为最佳的发送时刻,周末明显没有工作日那么受欢迎,但同时这也跟你所发送的内容有关,因为内容会影响到你现在的订阅人。(译者注:周末为最佳发送时刻的订阅人比例分布图,表格中类别依次是:政府,商务与经济,非赢利,艺术,电子商务,零售,习惯。)

edm

我们在本段讨论的都是将周末为最佳发送时刻的订阅人以及邮件地址。打开商务类内容邮件的订阅人比例低于平均水平。在另一方面,消遣娱乐方面的内容更加受欢迎。但值得注意的是,无论在周末发送什么内容,订阅人所占的比例都低于50%,这说明无论发送什么内容,大部分订阅列表中主要的收件人的最佳发送地址还是在工作日。

现在我们看一下一天中不同时间段的情况是怎样的。(译者注:图表为一天中最佳发送时刻订阅人比例分布图。)

edm

从图中我们可以看出来,最佳发送时刻比例峰值出现在收件人当地时间早上10点左右。

除非你有很好的理由,否则不要在收件人当地时间太早的时候发送邮件(例如凌晨3点或4点)。如果你在东海岸,但是如果你的大部分订阅人在加州,你可以考虑设置好发送时间,以避免发到西海岸的时候太早。

但值得注意的是,即使早上10点是峰值,将早上10点作为最佳发送时间的订阅人数量也仅仅占到7%。这说明无论你选择几点发送活动,大部分列表上的订阅人都有其他最佳的发送时间。一天中并不存在这么一个时刻,在这个时刻每个人都停下手中的活并说:"现在是时候去打开邮件看一下了!"这个永远都不会发生的,我爱死这些数据了,他们把这种情况一下否决掉。

如果我们换个角度,从邮件内容的类型来研究,我们会发现实际上早上10点也未必就是收发邮件最佳时刻。例如,我们发现对于爱好类邮件,最佳收发时刻会稍微早一点,大概是在早上8点左右。或者这些收件人喜欢在他们上班前先看一下这一类内容。(译者注:下图为不同类型的邮件内容一天中最佳发送时间的订阅人百分比分布表格。)

edm

你会发现零售和爱好类型邮件会在工作时间外有更多人打开。(但早上依然是收发邮件高峰。)

关键在于受众,而不在于内容

我们已经找到了简单答案(在工作日早上发送邮件比较保险),同时我们也发现这些答案会因为收件人周末以及晚上的偏好和内容的不同而有所变化。这种依赖于邮件内容类型的现象表明我们所获得的这个重量级答案掩饰了更多隐藏在数据深处的有细微差别的真相。

你可能会想是不是邮件内容决定了你打开和阅读邮件的时刻。但对于我来说,事实并不是这样。我会在工作时间阅读零售方面的邮件。(老板,实在对不起!),同时我会躺在家里的沙发上阅读数据科学类的邮件。(亲爱的老婆,实在对不起!)

决定我是否打开,阅读,点击邮件内容的主要原因是我的生活。很多关于发送时间的分析以及有趣的现象都只局限于商务层面,但是为了让你明白应该什么时候发邮件给你的受众,你需要先去了解你的观众,而不是你的内容。他们是谁?他们的生活怎么样?什么时候他们才有空看一下手机里的促销信息?

为了快速举例说明这一点,让我们看一下共和党和民主党在收发邮件最佳时刻的分布差别。(译者注:图表为共和党以及民主党一天中最佳发送时刻分布图。)

edm

你可以看出来,两者之间几乎没啥差别。为什么会这样?因为从宏观上来讲,政治因素不会影响到一个个人查看邮件的安排以及能力。大量数据也并不一定要推翻常识。常识告诉我们,政治因素由于过于宽泛而且次要以至于并不会影响最佳的收发邮件时间。

那么让我们来想一下什么会影响到一个人打开邮件以及阅读邮件的时刻。因为收件人所处的地方以及文化?毕竟,不同国家的人有不同的时间表。让我们看看不同的国家最佳收发时间有什么区别。(译者注:图表为不同国家一天中最佳发送时刻时间分布图)

 edm

在西班牙更多人会选择在早上10点到11点期间看邮件。而在挪威(现在正处于白天时间很长的夏天)最佳发送时刻是在下班以后。另一方面,在埃及,黎明前打开邮件的人更加多。

很明显,地理位置会影响到最佳发送时刻。那年龄会不会也起作用呢?(译者注:图中为不同年龄段的人收发邮件最佳时刻一天中的分布图。)

edm

大学生收发邮件的最佳时刻是在下午1点而不是早上10点这个典型的高峰时间。如果你想得到大学生的作息习惯(特别在夏天),你就不会对这个结果感到惊讶。

年龄肯定是收发邮件最佳时刻的影响因素,我们研究对了方向。但为什么30岁的人不会像大学生一样睡到中午呢?我的情况是因为我的孩子不允许我这么做。但对于大多数人来说,他们需要上班工作!

那跟职业有关系吗?

当我们研究职业之间对于最佳收发时间的影响的时候,我们发现了不同职业间存在最大的差别。在下图,我已经作出了律师,酒吧销售以及护士收发邮件最佳时刻分布图。

edm

酒吧销售就跟大学生一样,一天起的比较晚,所以他们的最佳收发时间在下午一点左右出现峰值。而律师则有两个峰值,分别出现在工作日早上9点以及午餐过后,几乎没有律师的最佳发送时间是在工作时间以外。

而对于护士来说,由于她们的工作时间分布比较广,因此她们的最佳收发时间分布更加广泛并且高峰没那么明显。事实上,很多护士的最佳收发邮件时间是在晚上8点。

那如果我并没有打算发给一个挪威的酒吧销售呢?

上面的图表勾勒出了一个订阅列表最佳发送时间的决定性因素所引起的细微差别。应该有一个更加高级别的更加简单明了的答案才对的,但是由于不同的受众,这个简单的答案还是被细分成好几个答案。所幸的是,MailChimp的STO系统捕捉了所有这些细微差别。因此大胆去尝试STO系统给你的建议把!

而且,上面的结果没有一个让人惊讶。酒吧销售并不想在早上八点查看邮件这个事实太明显了。这是一件好事!这意味着STO(依靠大量数据与数学技术支撑)并不是在玩魔术。你可以做一些假设,然后根据你对你的受众的了解进行A/B测试区验证你的假设。(千万要记住,进行关于发件时间的A/B测试能够提高22%的可能让你的受众查看邮件。)

因此,我希望这篇文章能够给出"我该什么时候发送邮件"这个老掉渣的问题一个答案。请记得:

  1. 在工作日早上发送邮件
  2. 除非你知道一些关于你的观众的情况,你也确实应该知道。如果是这样的话,上一条一般都是错的。
  3. 通过A/B测试获得更好的答案。

祝你发送愉快!

[分享]五款优秀的 Linux 端口扫描工具

2015年12月16日星期三 | | 0 评论 |

端口扫描器是一种检测服务器或主机虚拟端口是开启或关闭的工具。端口允许同一台计算机上的不同应用程序同时共享网络资源。连接本地局域网或互联网的计算机运行着许多不同服务,它们监听着常用或不常用的端口。端口数的范围从0到65535,0到1023的端口数最常用,它们中有许多是为FTP、SSH、HTTP、telnet、DNS和NNTP等服务保留的,1024到49151端口是注册端口,49152到65535则分配给动态或私人端口。Linux上有很多端口扫描器,帮助系统管理员识别和纠正系统漏洞。

Linuxlinks 的这篇文章列出了五款优秀的端口扫描器,供感兴趣的管理员和用户参考。

它们包括:

1. Nmap

Nmap 是一款用于网络浏览或安全审计的免费开源工具。

2. Unicornscan

Unicornscan 是一个新的信息收集引擎,主要用于安全研究和通讯测试,主要特点是精确、灵活而且高效。

3. Zenmap

ZenMap是安全扫描工具NMap的一个官方的图形 用户界面,是一个跨平台的开源应用,不仅初学者容易使 用,同时为高级使用者提供了很多高级特性。频繁的扫描能够被存储,进行重复运行。命令行工具提供了直接与NMap的交互操作。扫描结果能够被存储便于事后 查阅。存储的扫描可以被比较以辨别其异同。最近的扫描结果能够存储在一个可搜索的数据库中。一个典型的ZenMap界面截图如图12.1所示。

4. nast

Network Analyzer Sniffer Tool (nast) 是一个网络包嗅探和局域网分析工具,基于 libnet 和 libpcap 开发。

5. Knocker

Knocker 是一个简单易用的 TCP 端口扫描工具,采用 C 语言编写,用于分析主机上运行的服务。

[分享] Windows 7 PPTP VPN Client Setup

2015年11月7日星期六 | | 0 评论 |

Windows 7 PPTP VPN Client Setup

Let's talk about Windows 7 PPTP VPN client setup in this article, so that you can connect to your home or company's PPTP VPN server later. In addition, you can also use this VPN client to connect to VPN server that supports L2TP/IPSec, SSTP or IKEv2 VPN protocol.

Without wasting more time, let's start to configure Windows 7 PPTP VPN client:

1) Go to Start and click on Control Panel.

2) Proceed to click View network status and tasks in Control Panelwindow.

how to view network status and tasks in Windows 7

3) Network and Sharing Center window will appear, proceed to click on Set up a new connection or network.

set up VPN client in Windows 7

4) Set up a Connection or Network window appears. Choose Connect to a workplace option and click Next.

connect to a workplace in windows 7 win7

5) Proceed to click on Use my Internet connection (VPN) (your computer should have connected to network).

use VPN connection in Windows 7

6) Let's type the IP address or host name of the VPN server computerthat you plans to connect to and also name the connection. Most of the time the IP address is the public WAN IP of your home network's DSL/cable Internet connection if the VPN server is located behind your home router. Click Next.

Note: Check this what is my WAN IP article if not too sure about WAN IP of your home network's Internet connection.

Note: Tick that Don't connect now; just set it up so I can connect lateroption if you are not ready to establish the VPN connection yet. You can also tick other options if it's applicable.

Windows 7 VPN server IP address

7) Type your VPN user name and password, after that click Create.

Note: For safety concern, don't tick Remember this password option.

username password for PPTP VPN

8) Ok! Now the VPN connection is ready to use, just click Connect now to establish the VPN connection if you are ready. If not, click Close and connect it later.

Windows 7 - connect PPTP VPN

9) If you click on network icon (right hand corner of taskbar area), you will notice that new VPN connection item is created and you can clickConnect to establish VPN connection.

Note: You can also right click the VPN connection and click on Propertiesin order to configure this connection in details as needed.

VPN client detailed options

Note: If you open VPN connection properties, you can make further VPN configuration. The security tab also shows you the supported VPN types (Automatic is default setting)

Windows 7 - type of supported VPN

Related Articles:

Virtual Private Network (VPN) Introduction
Simple PPTP VPN Server Setup in Windows XP
Configuring PPTP VPN Client in Windows XP
PPTP VPN Client Setup in Windows Vista

Return to top of "Windows 7 PPTP VPN Client Setup"!!


from: http://www.home-network-help.com/windows-7-pptp-vpn.html

tec. 美国VPS  无限分享 西部数码分销商 便宜VPS   捷飞网络科技论坛  捷飞网络  云主机,VPS 西部数码代理

分享PHP中获取当前页面的URL相关浅析

2015年11月3日星期二 | | 0 评论 |

javascript实现:

top.location.href   顶级窗口的地址
this.location.href 当前窗口的地址

PHP实现:

<?php
#测试网址:     http://localhost/blog/testurl.php?id=5

//获取域名或主机地址 
echo $_SERVER['HTTP_HOST']."<br>"; #localhost

//获取网页地址 
echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php

//获取网址参数 
echo $_SERVER["QUERY_STRING"]."<br>"; #id=5

//获取用户代理 
echo $_SERVER['HTTP_REFERER']."<br>"; 

//获取完整的url
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
#http://localhost/blog/testurl.php?id=5

//包含端口号的完整url
echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
#http://localhost:80/blog/testurl.php?id=5

//只取路径
$url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]; 
echo dirname($url);
#http://localhost/blog
?>

参考: http://www.cnblogs.com/A-Song/archive/2011/12/14/2288215.html

分享php实现JavaScript中escape函数加密与unescape解密

2015年10月11日星期日 | | 0 评论 |

在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑 到js中有unescape函数,故若在php中有个escape函数,对数据进行编码,在客户端用unescape进行 解码,这样就会方便很多。 

先在网上搜索一把,很多用php实现的escape函数,大同小异

  1. function phpescape($str){ 
  2.     preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$newstr); 
  3.     $ar = $newstr[0]; 
  4.     foreach($ar as $k=>$v){ 
  5.         if(ord($ar[$k])>=127){ 
  6.             $tmpString=bin2hex(iconv("GBK","ucs-2",$v)); 
  7.             if (!eregi("WIN",PHP_OS)){ 
  8.                 $tmpString = substr($tmpString,2,2).substr($tmpString,0,2); 
  9.             } 
  10.             $reString.="%u".$tmpString; 
  11.         } else { 
  12.             $reString.rawurlencode($v); 
  13.         } 
  14.     } 
  15.     return $reString; 
  16. }  



这个函数可以很好的工作,但是,也许有新手不理解这个函数的原理(比如我),用起来总是不放心,现在我就来解释一下这个函数的原理。而且我认为,拿别人的代码来复用,好比站在了巨人的肩膀上,但是若不理解别人的代码,迟早要掉到地面上。 

第一句:preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);这个是用正则表达式匹 配字符串中所有的字符,[\x80-\xff]. 匹配的是汉字,\x表示匹配字符的16进制编码,[ ] 是类选择符,"." 表示任意一个字符,这样[\x80-\xff].匹配的是两个字符,其中第一个就是16进制从80到ff的字符,而这恰好就是汉字编码的第一个字符。这样 就能完整的匹配一个汉字。关于unicode中汉字的编码,大家可以到网上搜索一下。同理,[\x01-\x7f]+英文字符串,因为最早的英文是 ASCII编码,编码值小于128,也就是16进制的从01到7f,"+"表示一个或者多个字符,这样[\x01-\x7f]+就能匹配连续多个英文字符 串。 

$ar = $r[0];             //$r[0]里存放是匹配到的数组 
  foreach($ar as $k=>$v) { 
    if(ord($v[0]) < 128)                 //假如字符编码值小于128,说明是个英文字符 
      $ar[$k] = rawurlencode($v);    //直接用rawurlencode编码 
    else 
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));    //否则的话用iconv函数把汉字转变成ucs-2编码,也就是unicode编码 
  } 

这个就是关于php中escape函数的一个实现,欢迎大家补充 

有时候可能会遇到PHP版本不同,导致出来结果不同,以致于乱码 
下面这个备用 

php提供的URL编码函数是基于字节的,对由ie的javascript函数escape编码的数据就无能为力了。 
因此在此共享本人的php版的escape/unescape函数 

一个加密一个解密的

  1. function escape($str) { 
  2.   preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r); 
  3.   $ar = $r[0]; 
  4.   foreach($ar as $k=>$v) { 
  5.     if(ord($v[0]) < 128
  6.       $ar[$k] = rawurlencode($v); 
  7.     else 
  8.       $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v)); 
  9.   } 
  10.   return join("",$ar); 
  11.  
  12. function unescape($str) { 
  13.   $str = rawurldecode($str); 
  14.   preg_match_all("/(?:%u.{4})|.+/",$str,$r); 
  15.   $ar = $r[0]; 
  16.   foreach($ar as $k=>$v) { 
  17.     if(substr($v,0,2) == "%u" && strlen($v) == 6) 
  18.       $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4))); 
  19.   } 
  20.   return join("",$ar); 
参考:http://www.cuplayer.com/player/PlayerCodeJS/2014/0711/1429.html

其它:

//编码,编码后为小写
function escape($str){
preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$newstr);
$ar = $newstr[0];
foreach($ar as $k=>$v){
   if(ord($ar[$k])>=127){
    $tmpString=bin2hex(iconv("GBK","ucs-2//IGNORE",$v));
    if (!eregi("WIN",PHP_OS)){
     $tmpString = substr($tmpString,2,2).substr($tmpString,0,2);
    }
    $reString.="%u".$tmpString;
   }else{
    $reString.= rawurlencode($v);
   }
}
return $reString;
}

//解码为HTML实体字符
function unescape ($source){ 
$decodedStr = ""; 
$pos = 0; 
$len = strlen ($source); 
while ($pos < $len){ 
   $charAt = substr ($source, $pos, 1); 
         if ($charAt == '%'){ 
    $pos++; 
    $charAt = substr ($source, $pos, 1); 
             if ($charAt == 'u'){ 
     // we got a unicode character 
     $pos++; 
     $unicodeHexVal = substr ($source, $pos, 4); 
     $unicode = hexdec ($unicodeHexVal); 
     $entity = "&#". $unicode . ';'; 
     $decodedStr .= utf8_encode ($entity); 
     $pos += 4; 
             }else{ 
     // we have an escaped ascii character 
     $hexVal = substr ($source, $pos, 2); 
     $decodedStr .= chr (hexdec ($hexVal)); 
     $pos += 2; 
    } 
   }else{ 
    $decodedStr .= $charAt; 
    $pos++; 
   } 

return $decodedStr; 
}


//直接解码为字符串。网上找到的这个版本的函数是解码为HTML实体字符,这是我修改的
function unescape($source){ 
$decodedStr = ""; 
$pos = 0; 
$len = strlen ($source); 
while ($pos < $len){ 
   $charAt = substr ($source, $pos, 1); 
         if ($charAt == '%'){ 
    $pos++; 
    $charAt = substr ($source, $pos, 1); 
             if ($charAt == 'u'){ 
     // we got a unicode character 
     $pos++; 
     $unicodeHexVal = substr ($source, $pos, 4); 
     $unicode = hexdec ($unicodeHexVal); 
     $decodedStr .= u2utf82gb($unicode); 
     $pos += 4; 
             }else{ 
     // we have an escaped ascii character 
     $hexVal = substr ($source, $pos, 2); 
     $decodedStr .= chr (hexdec ($hexVal)); 
     $pos += 2; 
    } 
   }else{ 
    $decodedStr .= $charAt; 
    $pos++; 
   } 

return $decodedStr; 
}
function u2utf82gb($c){
$strphp = "";
if($c < 0x80){
   $strphp .= $c;
}elseif($c < 0x800){
   $strphp .= chr(0xC0 | $c>>6);
   $strphp .= chr(0x80 | $c & 0x3F);
}elseif($c < 0x10000){
   $strphp .= chr(0xE0 | $c>>12);
   $strphp .= chr(0x80 | $c>>6 & 0x3F);
   $strphp .= chr(0x80 | $c & 0x3F);
}elseif($c < 0x200000){
   $strphp .= chr(0xF0 | $c>>18);
   $strphp .= chr(0x80 | $c>>12 & 0x3F);
   $strphp .= chr(0x80 | $c>>6 & 0x3F);
   $strphp .= chr(0x80 | $c & 0x3F);
}
return iconv('UTF-8', 'GB2312', $strphp);
}

参考:http://blog.163.com/zhaozunjie@126/blog/static/13982406120105264326456/


分享PHP版完善的ESCAPE/UNESCAPE/UNICODE/UTF8互转函数

| | 0 评论 |

分享PHP版完善的ESCAPE/UNESCAPE/UNICODE/UTF8互转函数

2005-12-10。从下午12点奋斗到晚上9点。
2005-12-11。根据唠叨的回帖,更新了转换的算法。对于那篇unicode编码的faq.我总算理解了整个转换的过程。理解了这个公式。

参考文章http://tech.163.com/05/0516/10/1JS9KEGA00091589.html
UTF编码

  UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制)UTF-8 字节流(二进制)
0000 - 007F0xxxxxxx
0080 - 07FF110xxxxx 10xxxxxx
0800 - FFFF1110xxxx 10xxxxxx 10xxxxxx

  例如"汉"字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。




终于将unicode和utf8互转搞定。


如果utf-8编码的字符ch是3个字节。xx yy zz
将xx和1F AND 操作得到 a
将yy和7F AND 操作得到 b
将zz和7F AND 操作得到 c

(64a+b)*64+c = ch(unicode编码)

echo.php没什么。就是几个函数。

<?php 
require_once("echo.php");

$data = "大闹西奴xx x8890.-_奴";
echo(urlencode($data));echo("<br/>");
//写入unicode文件
$ucs2data = utf8ToUnicode($data,"little");
$endian = chr(0xFE).chr(0xFF);
$endian =  chr(0xFF).chr(0xFE);
$rt = file_put_contents ( "ucs2.txt", $endian.$ucs2data); 
                //19:32,utf8toUnicode函数ok. 
                //20:09。发现little endian 和big endian问题。并解决。
                //big endian 方式存入的unicode字符串,ue和editplus均不能
                //识别。只有notepad正常识别。

$rt = file_put_contents ( "usc2ys_data.txt", $ucs2_ysdata);
//写入utf8文件
$utf8data = unicodeToUtf8($ucs2data);   // 20:52. 将字串转回utf8码ok.
$rt = file_put_contents ( "utf8.txt", $utf8data);
echo(urlencode($utf8data));echo("<br/>");

$esc = utf8Escape($data);
echot($esc);
$esc = phpEscape($data);
echot($esc);
$unesc = phpUnescape($esc);
echot($unesc);


/**
* 此函数将utf8编码字串转为unicode编码字符串 
* 参数 str ,utf8编码的字符串。
* 参数 order,存放数据格式,是big endian还是little endian,默认的unicode存放次序是little.
* 如:"大"的unicode码是 5927。little方式存放即为:27 59 。big方式则顺序不变:59 27.
* little 存放格式文件的开头均需有FF FE。big 存放方式的文件开头为 FE FF。否则。将会产生严重混乱。
* 本函数只转换字符,不负责增加头部。
* iconv转换过来的字符串是 big endian存放的。
* 返回 ucs2string , 转换过的字符串。 
* 感谢唠叨(xuzuning)
*/
function utf8ToUnicode($str,$order="little")
{
  $ucs2string ="";
    $n=strlen($str);
    for ($i=0;$i<$n ;$i++ ) {
  $v = $str[$i];
  $ord = ord($v);
  if( $ord<=0x7F){ //  0xxxxxxx  
     if ($order=="little") {
       $ucs2string .= $v.chr(0); 
   }
   else {
       $ucs2string .= chr(0).$v; 
   }
  }
  elseif ($ord<0xE0 && ord($str[$i+1])>0x80) {  //110xxxxx 10xxxxxx 
   $a = (ord($str[$i]) & 0x3F )<<6;
   $b =  ord($str[$i+1]) & 0x3F ;
   $ucsCode = dechex($a+$b);   //echot($ucsCode);
   $h = intval(substr($ucsCode,0,2),16);
   $l  =  intval(substr($ucsCode,2,2),16);
   if ($order=="little") {
       $ucs2string   .= chr($l).chr($h); 
   }
   else {
        $ucs2string   .= chr($h).chr($l); 
   }
   $i++;
  }elseif ($ord<0xF0  && ord($str[$i+1])>0x80  && ord($str[$i+2])>0x80) { //1110xxxx 10xxxxxx 10xxxxxx 
      $a = (ord($str[$i]) & 0x1F)<<12;     
   $b = (ord($str[$i+1]) & 0x3F )<<6;
   $c =  ord($str[$i+2]) & 0x3F ;
   $ucsCode = dechex($a+$b+$c);   //echot($ucsCode);
   $h = intval(substr($ucsCode,0,2),16);
   $l  =  intval(substr($ucsCode,2,2),16);
   if ($order=="little") {
       $ucs2string   .= chr($l).chr($h); 
   }
   else {
        $ucs2string   .= chr($h).chr($l); 
   }   
   $i +=2;
  }
    }
 return $ucs2string;   
} // end func

/* 
* 此函数将unicode编码字串转为utf8编码字符串 
* 参数 str ,unicode编码的字符串。
* 参数 order ,unicode字串的存放次序,为big endian还是little endian.
* 返回 utf8string , 转换过的字符串。
*
*/
function unicodeToUtf8($str,$order="little")
{
 $utf8string ="";
    $n=strlen($str);
    for ($i=0;$i<$n ;$i++ ) {
  if ($order=="little") {
      $val = dechex(ord($str[$i+1])).dechex(ord($str[$i]));
  }
  else {
   $val = dechex(ord($str[$i])).dechex(ord($str[$i+1]));
  }
  $val = intval($val,16); //由于上次的.连接,导致$val变为字符串,这里得转回来。
  $i++; //两个字节表示一个unicode字符。
  $c = "";
  if($val < 0x7F){        // 0000-007F
   $c .= chr($val);
  }elseif($val < 0x800) { // 0080-0800
   $c .= chr(0xC0 | ($val / 64));
   $c .= chr(0x80 | ($val % 64));
  }else{                // 0800-FFFF
   $c .= chr(0xE0 | (($val / 64) / 64));
   $c .= chr(0x80 | (($val / 64) % 64));
   $c .= chr(0x80 | ($val % 64));
   //echot($c);
  }  
  $utf8string .= $c;
    }
 return $utf8string;
} // end func

 

/* 
* 将utf8编码的字符串编码为unicode 码型,等同escape 
* 之所以只接受utf8码,因为只有utf8码和unicode之间有公式转换,其他的编码都得查码表来转换。
* 不知道查找utf8码的正则是否完全正确。迷茫ing
* 虽然调用utf2ucs对每个字符进行码值计算。效率过低。然而,代码清晰,要是把那个计算过程嵌入。
* 代码就不太容易阅读了。
*/
function utf8Escape($str) {
  preg_match_all("/[\xC0-\xE0].|[\xE0-\xF0]..|[\x01-\x7f]+/",$str,$r);
  //prt($r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
 $ord = ord($v[0]);
    if( $ord<=0x7F)
      $ar[$k] = rawurlencode($v);
    elseif ($ord<0xE0) { //双字节utf8码
      $ar[$k] = "%u".utf2ucs($v);
    }
  elseif ($ord<0xF0) { //三字节utf8码
      $ar[$k] = "%u".utf2ucs($v);
 }
  }//foreach
  return join("",$ar);
}

/**
*
* 把utf8编码字符转为ucs-2编码
* 参数 utf8编码的字符。
* 返回 该字符的unicode码值。知道了码值,你就可以使用chr将字符弄出来了。

*  原理:unicode转为utf-8码的算法是。头部固定位或。
 该过程的逆向算法就是这个函数了,头部固定位反位与。
*/

function utf2ucs($str){
 $n=strlen($str);
 if ($n=3) {
     $highCode = ord($str[0]);     
  $midCode = ord($str[1]);
     $lowCode = ord($str[2]);
  $a   = 0x1F & $highCode;
  $b   = 0x7F & $midCode;
  $c   = 0x7F & $lowCode;
  $ucsCode = (64*$a + $b)*64 + $c;  
 }
 elseif ($n==2) {
    $highCode = ord($str[0]);     
     $lowCode = ord($str[1]);
  $a   = 0x3F & $highCode;  //0x3F是0xC0的补数
  $b   = 0x7F & $lowCode;  //0x7F是0x80的补数
  $ucsCode = 64*$a + $b;  
 }
 elseif($n==1) {
     $ucscode = ord($str);
 }
 return dechex($ucsCode);
}

 


/* 
* 用处 :此函数用来逆转javascript的escape函数编码后的字符。
* 关键的正则查找我不知道有没有问题.
* 参数:javascript编码过的字符串。
* 如:unicodeToUtf8("%u5927")= 大 
* 2005-12-10 

*/
function phpUnescape($escstr){
  preg_match_all("/%u[0-9A-Za-z]{4}|%.{2}|[0-9a-zA-Z.+-_]+/",$escstr,$matches); //prt($matches);
  $ar = &$matches[0];
  $c = "";
  foreach($ar as $val){
 if (substr($val,0,1)!="%") { //如果是字母数字+-_.的ascii码
     $c .=$val;
 }
 elseif (substr($val,1,1)!="u") { //如果是非字母数字+-_.的ascii码
  $x = hexdec(substr($val,1,2));
     $c .=chr($x);
 }
 else { //如果是大于0xFF的码
  $val = intval(substr($val,2),16);
  if($val < 0x7F){        // 0000-007F
   $c .= chr($val);
  }elseif($val < 0x800) { // 0080-0800
   $c .= chr(0xC0 | ($val / 64));
   $c .= chr(0x80 | ($val % 64));
  }else{                // 0800-FFFF
   $c .= chr(0xE0 | (($val / 64) / 64));
   $c .= chr(0x80 | (($val / 64) % 64));
   $c .= chr(0x80 | ($val % 64));
  }
 }
  }
  return $c;
}

 

/* 
* 等同escape 
* 来自网上。本文件其他几个函数都参考了这个函数里面的关键算法。
*/
function phpEscape($str,$encode="") {
  if ($encode=="" && !(function_exists("mb_detect_encoding"))) {
      echo "error You must enter the string's encoding or extend the php for mb_string";
   return ;
  }
  elseif($encode=="") {
   echo "Use mb_string function to detect the string's encoding <br/>";
      $encode = mb_detect_encoding($str);
  }
  preg_match_all("/[\xC0-\xE0].|[\xE0-\xF0]..|[\x01-\x7f]+/",$str,$r);
  //prt($r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
 $ord = ord($v[0]);
    if( $ord<=0x7F)
      $ar[$k] = rawurlencode($v);
    elseif ($ord<0xE0) {
      $ar[$k] = "%u".bin2hex(iconv($encode,"UCS-2",$v));
    }
  elseif ($ord<0xF0) {
      $ar[$k] = "%u".bin2hex(iconv($encode,"UCS-2",$v));
 }
  }//foreach
  return join("",$ar);
}

?>

参考: http://gudai.cnblogs.com/articles/294580.html

更多:  美国VPS  博客 西部数码分销商 便宜VPS   捷飞网络科技论坛  捷飞网络  云主机,VPS 西部数码代理

分享php实现javascript的fromCharCode方法

2015年10月10日星期六 | | 0 评论 |

fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
语法:
String.fromCharCode(numX,numX,…,numX)

注意:
该方法是 String 的静态方法,字符串中的每个字符都由单独的数字 Unicode 编码指定。
它不能作为您已创建的 String 对象的方法来使用。因此它的语法应该是 String.fromCharCode()

PHP实现javascript的fromCharCode()方法:

1
2
3
4
5
6
7
8
9
10
function fromCharCode()
{
    $codes= func_get_args();
    $str= '';
    foreach ($codes as $code)
    {
        $str.= mb_convert_encoding('&#' . intval($code) . ';', 'UTF-8', 'HTML-ENTITIES');
    }
    return $str;
}
使用示例:
1
2
$str = fromCharCode(72,69,76,76,79);
var_dump($str);

参考: http://www.phpjiayuan.com/90/223.html


所有文章收集于网络,如果有牵扯到版权问题请与本站站长联系。谢谢合作![email protected]