Saber 酱的抱枕

Fly me to the moon

07/26
2016
学习

原生Ajax的简单实例

因为JavaScript水平太渣,以前我都是用JQuery来做ajax。现在看了些资料,感觉原生的写法也不难,而且兼容性也已经不错了,所以跟着练一练。

同步的ajax请求:

var xhr=new XMLHttpRequest();
xhr.open("get","http://saber.我爱你/demo/checknew.php",false);
xhr.send(null);
if (xhr.status===200) {
	alert(xhr.responseText);
}else{
	alert("发生了异常,状态码为"+xhr.status+","+xhr.statusText);
}

返回的数据里有如下属性:
responseText:作为响应主体被返回的文本。
responseXML:如果响应的内容类型是"text/xml"或"application/xml",这个属性中将保存包含着响应数据的XML DOM 文档。
status:响应的HTTP 状态。
statusText:HTTP 状态的说明。


异步的ajax请求:

var xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
	if (xhr.readyState===4) {
		if (xhr.status===200) {
			alert(xhr.responseText);
		}else{
			alert("发生了异常,状态码为"+xhr.status+","+xhr.statusText);
		}
	}
}
xhr.open("get","http://saber.我爱你/demo/checknew.php",true);
xhr.send(null);

检测状态的部分也可以这样写:

xhr.onload=function (argument) {
	if (this.status == 200) {
		//……
    }
}

异步请求除了在xhr.open里将最后的参数设置为true之外,在接收数据时也和同步请求不同。异步请求通过检查xhr对象的readyState属性来判断请求处在哪个阶段。当readyState为4时,表示接收到了数据,并且数据可用。

我们通过onreadystatechange事件来检测readyState的值,当值为4时即可对数据进行处理。

另外,在接收到响应之前还可以调用abort()方法来取消异步请求。即xhr.abort(); 。

原生Ajax的简单实例

07/24
2016
ACG 游戏

神姫Project HCG下载

神姫Project HCG资源 cg下载 动态cg

此资源已失效

这是截止至2016年6月30日时,神姬全部的HCG,都是做成了gif图片的,另外还有些静态cg图片。

在国内说到神姬,恐怕大家第一印象就是绿帽了←_← 我不喜欢ntr,也没打算去玩这游戏(唉,像我这么纯洁的人不多了),所以我的内心不但毫无波动,甚至还听到了引擎的轰鸣声。

放几张静态预览图 姑且加个预警,未成年人请务必在家长陪同下观看。
Read More →

神姫Project HCG下载

07/21
2016
学习

php截取中文不乱码的代码

php中最常用的截取文字的函数是substr(),但是在该函数中,中文占用2个或3个长度,所以可能把汉字截断,产生乱码。

有一个办法是使用mb_substr()来截取文字。这样确实可以,因为mb_substr()把所有文字都当做一个长度,所以截取中文时是整个字截取的,不会乱码。但mb_substr()的长度计算方法和substr()不同,有时候反而不能用它。经过一番苦搜,我找到了用php的ord()函数来截取文字的办法。

这种方法的字数计算方法和substr()一致,但不会导致汉字被截断.如果指定的长度会截断汉字,它会把因截断而产生的残缺汉字扔掉(以最后截取出来的长度有可能会比指定的长度少一两位。)。

另外它的参数也只有两个,一个是字符串,一个是截取长度。没错,它不能指定起始位置。

GBK版本:

function gb2312_substr($str, $limit) {
    $restr ='';
    for($i=0;$i< $limit-3;$i++) {
        $restr .= ord($str[$i])>127 ? $str[$i].$str[++$i] : $str[$i];
    }
    return $restr;
}

UTF-8版本:

function utf8_substr($str, $limit) {
    $restr = '';
    for($i=0;$i< $limit-3;$i++) {
        $restr .= ord($str[$i])>127 ? $str[$i].$str[++$i].$str[++$i] : $str[$i];
    }
    return $restr;
}

php截取中文不乱码的代码

07/18
2016
ACG

一组艾米莉亚cosplay图片

Re:从零开始的异世界生活 爱蜜莉雅 cosplay 图片 Emilia

前几天就发了一张,你们表示要丢我蕾姆? 有本事丢啊,我一定好好接住

今天又搜了搜,找到了coser信息,顺带又找到了一些图←_← 来来来,快丢我一车蕾姆。

coser:しらが泱 (Shiraga Yanko)
国籍:Taiwan
WorldCosplay主页
Read More →

一组艾米莉亚cosplay图片

07/18
2016
学习

php获取url的状态码

function http_status($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_exec($ch);
    $status = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return $status;
}

可以用这个函数来获取url请求的状态码,判断404很方便→_→

不过如果测试p站图片url的话,还得加上refer信息来绕过防盗链。

一个下载器搞得我找了好多php的东西,心好累。

php获取url的状态码

07/15
2016
学习

关于PHP操作文件时最长文件名的研究

先吃我大鼻孔

今天我在改进pixiv下载器,想把tag信息保存到文件名里。前两天我研究了“windows中文件名最大长度的问题”,也是为这个做准备。我很快把获取tag的代码写好了,也在php里限制了文件名最大长度。但是做完之后感觉有点不对劲。怎么不对劲呢?下载图片的失败几率比以前大大提高了。错误都是:

Warning:fopen() Invalid argument

那么到底文件名哪里不对呢?这问题折腾了我五六个小时,我下班都没回去,坐在办公室里还在研究这个问题。天见可怜,我终于还是找到了问题的真相。

问题还是出在长度上。

windows计算文件名(包括路径)都是按【字数】算的,也就是说,不管你是中英混合还是怎么的,都能写满256个字。

我以为用php去创建文件也可以这样,于是我在php里用mb_strlen()函数去计算字数,这个函数也是把一个文字当做一个长度算。结果我这样做是错的,php虽然也会限制文件名和路径长度之和不能超过256个字符,但它真的只是字符长度,不是字数。所以php里操作文件时,涉及到文件名长度,要使用strlen()函数。

strlen()的计算方法是,英文占一个字符,而中文字符在gbk编码中算两个字符,在utf8编码中算三个字符。还好我使用的gbk编码,否则能用的字数要更少了。

下面这个路径在php的gbk编码中算做256长度(字节?):

F:\wamp\www\t/pixivimg/专辑1422_ 【一无所有的“死亡回归”!】Re 从零开始的异世界生活特辑 /56938050_p0_tag-ナツキスバル,Re ゼロから始める異世界生活,スバル,菜月昴,ゼロから始める異世界生活,リゼロ,リゼロ500users入り,Re ゼロから始める異世界00usersxxxxxxx入り.jpg

当然,用windows的计算方式,刚到170个长度。

好吧……为了在有限的长度里多给tag腾腾地方,我把文件名里很多东西都去掉了。标题啊,日期啊什么的都扔了,只留下图片id和tag。现在的文件名是这样的:

19566474_p0-よんでますよ、アザゼルさん。,十点じゃ足りません!,ふつくしい,なにこれ綺麗,サラマンダーwwwwww,一体だけ浮いてるw,まんまですよ、マンダはん,アザゼルさん1000users入り,キャプショ.jpg

这个长度已经接近极限了。心好累,感觉不会再爱了。

关于PHP操作文件时最长文件名的研究

07/15
2016
学习

php中如何判断字数

最近有个功能需要判断字数。PHP 中有很多函数可以计算字符串的长度,如strlen,mb_strlen,mb_strwidth。测试如下:

echo strlen("你好ABC") . "";
# 输出 9
echo mb_strlen("你好ABC", 'UTF-8') . "";
# 输出 5
echo mb_strwidth("你好ABC") . "";
#输出 7

可以看出,strlen 把中文字符算成3个字节;mb_strlen 不管中文还是英文,都算1个字节;而 mb_strwidth 则把中文算成2个字节。

我需要的是字数而不是字节数,所以mb_strlen是我想要的。但是要注意,“把汉字算做1个长度”必须指定为utf-8编码,否则它也会把汉字算做3个字节。

另外,截取字符串时,也可以用mb_substr指定utf-8编码,将汉字算做一个长度。如:

echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');

这个输出需要页面环境有编码才不会乱码。例如将此结果输出到html中,输出的字符会使用html页面的编码。如果单独写这一行php输出,还会是乱码。

php中如何判断字数