文章关键字 ‘JavaScript’

用JavaScript实现PHP的urlencode函数

2010年06月11日,星期五

在写JavaScript(严格的说是JScript)版的六维空间作弊工具时(怎么又是这句话。。。其实我早就写完了。。。)需要用到PHP的urlencode函数,于是Google之,发现有几种说法。

有的说用JavaScript自带的encodeURIComponent函数即可实现,真是睁着眼睛说瞎话。不解释,自己测试一下就知道JavaScript的encodeURIComponent的PHP的urlencode是不一样的。有的给出了由VBScript和JavaScript混合编写的urlencode,对不对我没有测试,即使对,也只有IE兼容VBScript。还有的贴出一段不知道是自己写的还是哪里转来的代码,都不测试一下对不对就公布出来。

根据我的经验,中文一般是搜不出什么好代码的,用英文的Google搜索,找到三个不同的版本实现,phpjs.orgwebtoolkit.infocass-hacks.com。第一个给出的函数可以直接使用,第二个给出的Url变量也可以直接使用,第三个给出的函数也是对的,但是要保证输入的参数是UTF-8编码。传说JavaScript的内部采用的是UTF-16编码(是不是我也不知道,传说而已),所以要使用第三个函数需要先把字符串转成UTF-8。幸好这个牛人提供了这样一个函数,把两个结合起来就完成了JavaScript版的urlencode函数。代码太长久不贴出来了,直接下载把,下面是在线演示(注意在博客首页无法演示)


注:不同编码下中文的urlencode是不同的,例如“恶魔”在UTF-8编码下urlencode后为%E6%81%B6%E9%AD%94,而在gb2312编码下urlencode后为%B6%F1%C4%A7。鉴于UTF-8比较普遍,本代码仅实现了UTF-8编码的PHP urlencode函数

下载程序代码[download id=9]

PHP & JavaScript: UTF-16 to UTF-8

2010年06月3日,星期四

外国的一个博客上摘录的,原文如下(附上我的烂翻译):

Recently I’ve been doing some work on a PHP script that has to process a bunch of XML files (in this case they’re imsmanifest files) however a few of them weren’t being parsed successfully.

最近我在做一些用PHP处理一堆XML文件的工作(它们是imsmanifest文件),然而它们中的一些不能被成功的解析。

The problem was soon quite clear, some of the files had been encoded using UTF-16 which wasn’t playing nicely with PHP. To solve this I’ve written a function that attempts to detect if a string is encoded using UTF-16 (little endian or big endian) and then converts it to a slightly more PHP friendly UTF-8. All the complicated stuff is copied from these JavaScript functions for converting between UTF-8 and UTF-16.

原因很明显,一些文件是用对PHP不友好的UTF-16编码的。为了解决这个问题我写了一个尝试判断一个字符是否用UTF-16编码并将其转换成对PHP比较友好的UTF-8编码的函数。所有这些复杂的材料都是从JavaScript functions for converting between UTF-8 and UTF-16复制的。

function utf16_to_utf8($str) {
    $c0 = ord($str[0]);
    $c1 = ord($str[1]);

    if ($c0 == 0xFE && $c1 == 0xFF) {
        $be = true;
    } else if ($c0 == 0xFF && $c1 == 0xFE) {
        $be = false;
    } else {
        return $str;
    }

    $str = substr($str, 2);
    $len = strlen($str);
    $dec = '';
    for ($i = 0; $i < $len; $i += 2) {
        $c = ($be) ? ord($str[$i]) << 8 | ord($str[$i + 1]) : 
                ord($str[$i + 1]) << 8 | ord($str[$i]);
        if ($c >= 0x0001 && $c <= 0x007F) {
            $dec .= chr($c);
        } else if ($c > 0x07FF) {
            $dec .= chr(0xE0 | (($c >> 12) & 0x0F));
            $dec .= chr(0x80 | (($c >>  6) & 0x3F));
            $dec .= chr(0x80 | (($c >>  0) & 0x3F));
        } else {
            $dec .= chr(0xC0 | (($c >>  6) & 0x1F));
            $dec .= chr(0x80 | (($c >>  0) & 0x3F));
        }
    }
    return $dec;
}

Note this only does something if the string has a BOM, otherwise it is assumed that the string isn’t UTF-16 and it is returned unmodified.

注意这个函数只在字符串拥有BOM时有效,否则它推测字符串不是UTF-16编码的而返回没有经过修改的原始值。

I don’t know, but hopefully someone might find this useful. If anyone can see any problems with it please point them out, however at the moment it seems to be working for me.

我不知道,但是希望有人发现这个函数有用。如果谁发现这个函数有什么问题请指出来,至少目前为止它对我都是正确的。

用JavaScript实现PHP的sha1函数

2010年06月1日,星期二

在写JavaScript(严格的说应该是JScript)版的六维空间作弊工具时要用到sha1函数,而网上Google到的大部分只实现了返回字符串的形式,而我需要的是返回二进制形式的,没办法,还是自己写吧。还是PHP好,直接提供了一个sha1函数,不知道以后的JavaScript会不会提供。代码太长就不贴出来了,自己下载吧。参数和PHP的sha1函数一样,不会用的话查看PHP手册。sourceforge上面有一个jsSHA库,但是根据我的测试对中文的加密和PHP的sha1函数不一致,估计是写的时候没有考虑的JavaScript内部对字符串是UTF-16编码。

在线演示(注意在博客首页无法演示)

字符串:
SHA1值:

下载地址:[download id=8]