kylin's profileKylin's SitePhotosBlogListsMore Tools Help

Blog


    4/30/2007

    Philips

    今天去飞利浦移动体验馆兼职了,
    时间:9:30am--9:30pm,
    地点:王府井新东安广场-1楼
    好累好累~~改天有力气了再写吧
    五一真的是劳动节啊~~
    今晚经过南一,看见草地上灯光下有只蚯蚓,我给她喝了口可乐,她爽死了
    哈哈,我没被累趴下,回来了,yeah
    4/28/2007

    中文分词(3.1)常用PHP函数


    做中文分词,本质就是字符串处理,因此,认识一下php字符串处理等常用的PHP函数是十分必要的,下面精选了20个函数并注释说明:
    //字符串处理函数库
            int strlen(string str) 
                    //返回字符串str的长度
            array explode(string separator,string str[,int limit) 
                    //用字符串separator将另一个字符串str分开,如果separator为""则返回FALSE,否则返回字符串str分开后的子串数组
            string trim(string str[,string charlist]) 
                    //从字符串头尾去除空白字符,也可指定要去除的字符 
                    //注:空白字符包括:" ","\t","\n","\r","\0","\x0B",即ASCII字符----0x20,0x09,0x0A,0x0D,0x00,0x0B
            int ord(string str) 
                   //返回字符串str第一个字符的ASCII码
            string bin2hex(string str)
                   //将二进制数据转换为十六进制表达式
            string substr(string str,int start[,int length])
                  //返回字符串str中从start处开始的length长度的子串
            mixed str_replace(mixed search,mixed replace,mixed subject[,int $count])
                  //返回在subject中搜索search并用replace替换后的字符串或数组
                  //如果search、replace都是用数组形式提供的,则替换关系是一一对应的
            int strpos(string haystack,string needle[,int offset])
                  //返回在haystack中needle第一次出现的位置。如果找不到needle,将返回FALSE或0。
                  //注:可以用第三个参数offset指定haystack开始搜寻的位置,但返回值仍相对于haystack的开始位置 
    //数学函数库
            int hexdec(string hex_string) 
                  //返回与hex_string参数所表示的十六进制数等值的十进制数
                  //注1:所能转换的最大数值为 7fffffff,即十进制的 2147483647。
                  //注2:将遇到的所有非十六进制字符替换成 0。这样,所有左边的零都被忽略,但右边的零会计入值中。如 hexdec("that") 和 hexdec("a0") 都将返回 160 
    //变量函数库
            void unset(mixed var[,mixed var[, ...]])
                  //销毁指定的变量。(注意:PHP4中unset()不再是真正的函数,而是一个语句,因此没有返回值)
            bool isset(mixed var[,mixed var[, ...]])
                  //检测变量是否设置,var存在则返回TRUE,否则返回FALSE
                  //注:若想检测常量是否已设置,可使用 defined
            bool is_array(mixed var)
                  //检测变量是否是数组
            void var_dump(mixed expression[,mixed expression[,...]])
                  //显示关于一个或多个表达式的结构信息,包括表达式的类型和值。数组将递归展开值,通过缩进显示其结构。

    //数组函数库
            int count(mixed var[,int mode])
                  //返回变量中单元数目,var通常是数组。
                  //注:如果不是数组,将返回1(例外:count(NULL)=0) 
    //文件系统函数库
            string dirname(string path)
                  //给出一个包含有指向一个文件的全路径的字符串,并返回去掉文件名后的目录名,推荐使用反斜线"/"作为路径分隔符
            resource fopen(string filename,string mode[,int use_include_path[,resource zcontext]])
                  //将filename指定的名字资源以mode方式绑定到一个流上
                  //注1:mode可能值为----r,r+,w,w+,a,a+,x,x+
                  //注2:如果也需要在 include_path 中搜寻文件的话,可以将可选的第三个参数 use_include_path 设为 '1' 或 TRUE。
                  //注3: 不同的操作系统家族具有不同的行结束习惯。当你写入一个文本文件并想插入一个新行时,你需要使用符合你操作系统的行结束符号。基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。Windows 下提供了一个文本转换标记('t')可以透明地将 \n 转换为 \r\n。与此对应你还可以使用 'b' 来强制使用二进制模式,这样就不会转换你的数据。要使用这些标记,要么用 'b' 或者用 't' 作为 mode 参数的最后一个字符。
                  //注4:在 Windows 平台上,要小心转义文件路径中的每个反斜线,或者用斜线。)
                  //更正: 在区分二进制文件和文本文件的系统上(如 Windows) 打开文件时,fopen() 函数的 mode 参数要加上 'b'。
            string fgets(int handle[,int length])
                  //从handle指向的文件中读取一行并返回长度最多为(length-1)字节的字符串,碰到换行符(包含在返回值中)、EOF则提前停止。注:如无指定,length默认为1024字节。
            bool fclose(resource handle)
                  //将handle指向的文件关闭,成功则返回TRUE
    //正则表达式函数库
            bool ereg(string pattern,string str[,array regs])
                  //以区分大小写的形式在str中寻找与给定的pattern所匹配的子串
                  //注:如果找到匹配的字串,且函数调用了第三个参数regs,则匹配项将被存入数组regs供使用,$regs[0]包含整个匹配的字符串,$regs[1]包含第一个字串
            mixed preg_replace(mixed pattern,mixed replacement,mixed subject[,int limit])
                  //执行正则表达式的搜索和替换。在subject中搜索pattern模式的匹配项并替换为replacement。
                  //注:如果指定了limit,则仅替换limit个匹配,否则所有匹配项都会被替换。
            int preg_match(string pattern,string subject[,array matches[,int flags]])
                  //进行正则表达式匹配。在subject中搜索与pattern模式的相匹配的内容。
                  //注:如果提供了matches,则搜索结果会保存在matches数组中。$matches[0]将包含整个匹配结果。$matches[1]将包含第一个匹配结果,以此类推。
    //时间日期函数库 
            string microtime(void)
                  //返回格式为“msec sec”的字符串,其中 sec 是当前的 Unix 时间戳,msec 是微秒部分。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。
                  //注1:字符串的两部分都是以秒为单位返回的。


    注:
  • 1、mixed是php中的伪类型,说明一个参数可以接受不同的但不必须是所有的类型;
  • 2、以上函数一般需要php4支持,但多数在php3中也可正常使用。
  • 3、斜体字部分是后来增加以及更正的。
  • 4/27/2007

    中文分词(2.5)UTF-8编码(2)

    为什么要用 UTF-8?
         首先 UCS 和 Unicode 只是分配整数给字符的编码表。现在存在好几种将一串字符表示为一串字节的方法。最显而易见的两种方法是将 Unicode 文本存储为 2个或 4个字节序列的串。这两种方法的正式名称分别为 UCS-2 和 UCS-4。除非另外指定, 否则大多数的字节都是这样的(Big-endian convention)。将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCII 字节前插入 0x00。如果要转换成 UCS-4,则必须在每个 ASCII 字节前插入三个 0x00。 
         在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题:用这些编码的字符串会包含一些特殊的字符,比如 '\0' 或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义。另外,大多数使用 ASCII 文件的 UNIX 下的工具,如果不进行重大修改是无法读取 16 位的字符的。基于这些原因,在文件名、文本文件、环境变量等地方,UCS-2 不适合作为 Unicode 的外部编码。
         在 ISO 10646-1 Annex RRFC 2279 里定义的 UTF-8 编码没有这些问题,它是在 Unix 风格的操作系统下使用 Unicode 的明显的方法。
    UTF-8 有以下特性:
    • 兼容性:UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的;
    • 唯一性:所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分;
    • 可同步:表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里,并指出这个字符包含多少个字节。多字节串的其余字节都在 0x80 到 0xBF 范围里,这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响;
    • 容量大:可以编入所有可能的 231个 UCS 代码,UTF-8 编码字符理论上可以最多到 6 个字节长,然而 16 位 BMP 字符最多只用到 3 字节长;
    • 顺序性:Bigendian UCS-4 字节串的排列顺序是预定的;
    • 可检验:字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到。
     下列字节串用来表示一个字符,用到哪个串取决于该字符在 Unicode 中的序号:

    U-00000000 - U-0000007F

    0xxxxxxx

    U-00000080 - U-000007FF

    110xxxxx 10xxxxxx

    U-00000800 - U-0000FFFF

    1110xxxx 10xxxxxx 10xxxxxx

    U-00010000 - U-001FFFFF

    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    U-00200000 - U-03FFFFFF

    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    U-04000000 - U-7FFFFFFF

    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


    xxx 的位置由字符编码数的二进制表示的位填入,越靠右的 x 具有越少的特殊意义。只用最短的那个足够表达一个字符编码数的多字节串,注意在多字节串中,第一个字节的开头"1"的数目就是整个串中字节的数目。
    例如:
  • Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为: 11000010 10101001 = 0xC2 0xA9
  • Unicode字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为: 11100010 10001001 10100000 = 0xE2 0x89 0xA0     这种编码的官方名字拼写为 UTF-8,其中 UTF 代表 UCS Transformation Format。请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8,当然除非你指的是一个变量名而不是这种编码本身。

    注释:
  • Big-endian 将一个Word(16位)中的高位的Byte(8位)放在内存中这个Word区域的低地址处的编码转换方式
  • 以上橙色字部分是个人笔记,如有谬误,敬请斧正。
  • 4/24/2007

    中文分词(2.4)UTF-8编码(1)

    (Googling...)
    (Googled,发现很多文章都推荐、引用这篇来自中国Linux论坛文章----UTF-8 and Unicode FAQ)

          这篇文章将说明在Linux上使用Unicode/UTF-8所需要的信息。Unicode不仅允许你处理事实上存在于地球上的任何语言文字,而且提供了一个全面的数学与技术符号集,因此可以简化科学信息交换。 UTF-8编码提供一种简便而向后兼容的方法,使得那种完全围绕ASCII设计的操作系统(比如UNIX,Linux)也可以使用UNICODE。
    什么是 UNICODE?
          历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.
    什么是 UCS 和 ISO 10646?
          国际标准ISO 10646定义了通用字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息。
          UCS 包含了用于表达所有已知语言的字符. 不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中文, 日文和韩文这样的象形文字, 以及 平假名, 片假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰米尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, 老挝语, 汉语拼音(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其他数也数不清的语. 对于还没有加入的语言, 由于正在研究怎样在计算机中最好地编码它们, 因而最终它们都将被加入. 这些语言包括 Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其他象形文字, 以及各种各样的印-欧语系的语言, 还包括挑选出来的艺术语言比如 Tengwar, Cirth 和 克林贡语(Klingon). UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符。
         ISO 10646 定义了一个 31 位的字符集. 然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位子集称为 基本多语言面 (Basic Multilingual Plane, BMP). 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们. 按当前的计划, 将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的 21 位的编码空间以外去了. ISO 10646-1 标准第一次发表于 1993 年, 定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第二部分 ISO 10646-2 正在准备中, 但也许要过好几年才能完成. 新的字符仍源源不断地加入到 BMP 中, 但已经存在的字符是稳定的且不会再改变了。
         UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF, 已经 BMP 以外的大范围的编码是为私用保留的。
    Unicode 和 ISO 10646 不同在什么地方?
         Unicode 协会公布的 Unicode 标准 严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里所有的字符都在相同的位置并且有相同的名字。Unicode 标准额外定义了许多与字符有关的语义符号学, 一般而言是对于实现高质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语言(比如阿拉伯语)表达形式的算法, 处理双向文字(比如拉丁与希伯来文混合文字)的算法和 排序与字符串比较 所需的算法, 以及其他许多东西。
         另一方面, ISO 10646 标准, 就象广为人知的 ISO 8859 标准(欧洲计算机制造商协会ECMA在上世纪80年代中期设计,并被国际标准化(ISO)组织采纳为国际标准,ISO 8859系列字符集目前有15个字符集)一样, 只不过是一个简单的字符集表. 它指定了一些与标准有关的术语, 定义了一些编码的别名, 并包括了规范说明, 指定了怎样使用 UCS 连接其他 ISO 标准的实现, 比如 ISO 6429 和 ISO 2022. 还有一些与 ISO 紧密相关的, 比如 ISO 14651 是关于 UCS 字符串排序的。
    4/22/2007

    中文分词(2.3)字符集简史(引)

    (这篇文章将说说编码问题,没想到搜到这么切题的文章----《UTF-8字符集基础》,以及《The Basics of UTF-8》)
          在所有字符集中,最知名可能要数被称为ASCII的7位字符集了。它是美国信息交换标准委员会(American Standards Committee for Information Interchange)的缩写, 为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。
          但是,由于他是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的欧洲文字时就会出现问题。因此,创建出了一些包括255个字符的由ASCII扩展的字符集。其中有一种通常被成为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO 8859-1 Latin 1,也简称为ISO Latin-1。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。
          欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被8位字符集所支持。仅汉语(或pictograms)字母表就有80000以上个字符。但是把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个字节就可以编码地球上几乎所有地区的文字。因此,创建了UNICODE编码。它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。UNICODE支持欧洲、非洲、中东、亚洲(包括统一标准的东亚像形汉字和韩国像形文字)。
    但是,UNICODE并没有提供对诸如Braille, Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持。同时它也不支持如Ahom, Akkadian, Aramaic, Babylonian Cuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之类的古老的文字。
          事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,既UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32。

    4/15/2007

    FedoraCore5(7)Web配置


    从4.15晚发布的spaces,到今天(070421)才填上内容,抱歉抱歉,其实这个问题本身并不难解决,看看引用里的两篇文章就可以了
    这篇比较经典,但由于版本比较古老,可能会有出入:
    Apache+Mysql+PHP典型配置 
    由于并不需要使用数据库,所以我安装的是“apache-2.2.4+PHP-4.4.6”,按照上面一篇的步骤是配置不成功的,不过基本了解了大致的思想,于是又google了一篇:
    新版Apache+Mysql+PHP配置 
    其中用的是:apache_1.3.26,所以编译php时有个参数需要修改"--with-apxs=/usr/local/apache/bin/apxs"改成"--with-apxs2=/usr/local/apache/bin/apxs"
    还要说明的是:
    1、apache安装成功后,我用firefox是没看到有什么羽毛标志,网页就写了“It works!”几个大字,"# /usr/local/apache/bin/apachectl stop"了就看不到了,可能是因为使用IE和firefox浏览器的不同吧;
    2、命令连接可以用"&&",比如:一般"./configure"成功之后,就可以"# make && make install"了,然后泡个咖啡,看着shell黑底上绿字在跑屏,等着就行了,非常惬意;
    3、人啊,每个阶段总有一些杂事儿,不要以此为借口放下手头的工作,比如像我这样一个网志开了个头,快一个礼拜了才写上内容,这样不好。

    4/11/2007

    谷歌拼音输入法

     
    因为google,谷歌拼音输入法刚发布,我就使用尝鲜了,当时的感觉是特别像一直在用的紫光拼音。
     
    没想到几天后,爆出新闻----“谷歌盗用搜狗拼音词库”。
     
    汗,鉴于搜狗词库事件,可以看出谷歌确实中国本土化了。