Linux下全能解压工具Peazip [Linux]
post by 朦朧中的罪惡 / 2010-7-6 10:54 Tuesday
在linux下面有时候需要解压缩各种格式的压缩文件,尤其是rar这种windows下常见的压缩文件。默认的程序unrar虽然可以解压缩文件但是如果遇到压缩包中含有中文文件的情况则会出现乱码的问题。
上网寻找了一番之后发现了Peazip 这款软件,它拥有图形界面且完美的支持多种类型的压缩格式,同时它还是一款跨平台的软件,Windows用户同样可以使用它,更酷的是,它还支持中文界面。
界面截图:
Peazip的下载地址:
http://peazip.sourceforge.net/index.html
标签: ubuntu
PHP接收GET中文参数乱码深入研究 [PHP]
post by 朦朧中的罪惡 / 2010-6-18 10:29 Friday
相信很多PHPer都会遇到这样的问题:在utf-8的页面下面,如果直接访问带有中文参数的地址如test.php?s=测试 这样的地址输出参数的值会乱码,在搜索引擎上查询了下相关资料,都只给出了一些解决方案,但是却没有人研究导致这个问题的原因,今天特写此文来深入这个问题产生的原因:
首先我们演示这个问题,测试代码和运行结果如下。
代码:
测试结果:
代码中声明了响应内容的编码为utf-8,显示的内容确实乱码。
在这里请注意var_dump出变量的长度只有4 ,很显然,两个中文字的长度在utf-8编码下肯定不止4个字节
然后我们再看一下Firefox的访问这个页面url
FireFox会自动将中文url编码,所以我们可以看到测试变成了%B2%E2%CA%D4,很明显,这里一个字是两个字节,是gb2313、gbk等中文编码格式,而不是utf-8编码。
如果我们把页面的编码切换为gbk,中文参数就会显示正常,参见下图
这时一个有趣的问题就诞生了:像emlog的中文标签这样的参数怎么就没有乱码呢?
多方测试后,我发现了一个小小的区别:
emlog中文参数的链接是在页面上生成的,而上面我们测试则用手直接在地址栏输入的,
如果我们直接输入例如http://be-evil.org/?tag=原创 这样的链接,程序同样会提示找不到标签
测试代码如下:
测试结果,正常显示:
请注意上图中红框标出的url编码,这次测试两个字是由6个字节组成,而不是先前的2个字节,因此表明中文参数已经正确的成为utf-8编码。
那么,是什么导致这个问题的发生呢?
答案是浏览器默认编码 在作怪,我们都用的是中文系统,浏览器默认的编码自然也会设置为本地化,例如我自己电脑上的IE的FireFox的默认编码都是gb系列的,请参看下图:
IE的默认设置:
Firefox的默认设置:
正因为这个设置,让浏览器在请求用户输入的url 时会默认把url中的中文以默认的编码格式发送而不是以页面的编码格式发送,这就是为什么页面中带有中文的链接正常而我们手动输入的链接会乱码的原因。同理,如果我们把浏览器的默认编码调整为utf-8,那么输入url中的中文则会按照utf-8编码。
除了上面的之外,还有以下情况会出现这种情况:
如果gbk编码的页面生成的地址链接到utf-8的页面,gbk页面的中文是按照gbk的格式编码传送给下个页面,那么utf-8编码接收后肯定会出现乱码。
IIS的url重写模块,重写后的中文编码也是gbk,如果你的页面是utf-8编码,那么重写参数将会失效。
像这些情况,我们就需要使用php内置的转码函数来处理编码问题了:
方案1:
$str = iconv("gb2312","utf-8",$str);
方案2:
mb_convert_encoding($str, "utf-8", "gb2312");
希望本文对那些因为编码问题而抓破头的PHPer们有所帮助 :)
FireFox主题Crystal Chrome [Firefox]
post by 朦朧中的罪惡 / 2010-6-17 20:28 Thursday
在FireFox的扩展中心又发掘到了一款新皮肤Crystal Chrome,这个皮肤其实是世界之窗浏览器的一款皮肤,装到Firefox上后效果非常不错,使用效果可参见下图
主题安装地址如下,虽然还没经过Mozilla检查,但是还是推荐试用
PHP实现html标签补全 [PHP]
post by 朦朧中的罪惡 / 2010-6-13 20:28 Sunday
我们有时候需要截断html的内容来输出,但是由于截断的位置并不确定,导致阶段后的html内容中的很多标签都没有正常闭合而导致页面变形,如何解决这个问题呢?当然是使用强大的正则表达式来匹配那些没有闭合的标签了,代码如下:
图片可以点击放大
用了这个函数就可以将截断的html补全了,下面是测试代码:
程序源码参见附件压缩包:
参考资料:
vim正则表达式 [软件应用]
post by 朦朧中的罪惡 / 2010-6-13 18:58 Sunday
元字符 说明
. 匹配任意一个字符
[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围,
如[a-z0-9]匹配小写字母和阿拉伯数字。
[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
\d 匹配阿拉伯数字,等同于[0-9]。
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。
\x 匹配十六进制数字,等同于[0-9A-Fa-f]。
\X 匹配十六进制数字,等同于[^0-9A-Fa-f]。
\w 匹配单词字母,等同于[0-9A-Za-z_]。
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。
\t 匹配<TAB>字符。
\s 匹配空白字符,等同于[ \t]。
\S 匹配非空白字符,等同于[^ \t]。
\a 所有的字母字符. 等同于[a-zA-Z]
\l 小写字母 [a-z]
\L 非小写字母 [^a-z]
\u 大写字母 [A-Z]
\U 非大写字母 [^A-Z]
表示数量的元字符
元字符 说明
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
\_. 匹配包含换行在内的所有字符
\{-} 表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好
\= 匹配一个可有可无的项
\_s 匹配空格或断行
\_[]
元字符 说明
\* 匹配 * 字符。
\. 匹配 . 字符。
\/ 匹配 / 字符。
\\ 匹配 \ 字符。
\[ 匹配 [ 字符。
表示位置的符号
元字符 说明
$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾
替换变量
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。
懒惰模式
\{-n,m} 与\{n,m}一样,尽可能少次数地重复
\{-} 匹配它前面的项一次或0次, 尽可能地少
\| "或"操作符
\& 并列
函数式
:s/替换字符串/\=函数式
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。
与Perl正则表达式的区别 ?
元字符的区别
Vim语法 Perl语法 含义
\+ + 1-任意个
\? ? 0-1个
\{n,m} {n,m} n-m个
\(和\) (和) 分组
例如:
1,去掉所有的行尾空格:“:%s/\s\+$//”。“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对前面的字符匹配一次或多次(越多越好),“___FCKpd___0rdquo;匹配行尾(使用“\___FCKpd___0rdquo;表示单纯的“___FCKpd___0rdquo;字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。(/<Space><Tab>)
2,去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。这回多了“\(”、“\)”、“\n”、“\r”和 “*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
3,去掉所有的“//”注释:“:%s!\ s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒是相当简单,用过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。
4,去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。
:g/^\s*$/d 删除只有空白的行
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 将 data1 data2 修改为 data2 data1
:%s/\(\w\+\), \(\w\+\)/\2 \1/ 将 Doe, John 修改为 John Doe
:%s/\<id\>/\=line(".") 将各行的 id 字符串替换为行号
:%s/\(^\<\w\+\>\)/\=(line(".")-10) .".". submatch(1)
将每行开头的单词替换为(行号-10).单词的格式,如第11行的word替换成1. word
排序 :/OB/+1,$!sort
标签: Vim
Vim替换语法大全 [软件应用]
post by 朦朧中的罪惡 / 2010-6-13 18:49 Sunday
:s/vivian/sky/
替换当前行第一个 vivian 为 sky
:s/vivian/sky/g
替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/
替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g
替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/
(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g
(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/#
替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+
(使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
*************************************
1. :s/vivian/sky/
替换当前行第一个 vivian 为 sky
:s/vivian/sky/g
替换当前行所有 vivian 为 sky
2. :n,$s/vivian/sky/
替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g
替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
3. :%s/vivian/sky/
(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g
(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
4. 可以使用#作为分隔符,此时中间出现的/不会作为分隔符
:s#vivian/#sky/#
替换当前行第一个 vivian/ 为 sky/
5. 删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到 unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
· 使用命令:cat filename1 | tr -d “^V^M” > newfile;
· 使用命令:sed -e “s/^V^M//” filename > outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
· 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。
· :%s/^M$//g
如果上述方法无用,则正确的解决办法是:
· tr -d "\r" < src >dest
· tr -d "\015" dest
· strings A>B
6. 其它
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/
用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g
用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g
用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g
用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g
功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
标签: Vim
PHP匹配GBK全中文字正则表达式(不包括GBK标点符号) [PHP]
post by 朦朧中的罪惡 / 2010-6-12 10:03 Saturday
今天朋友让我帮他弄个正则表达式,要求如下:
编码为gbk,要求,a-z,0-9,只匹配中文字不包括中文的标点符号如# ¥ % &等
查了下资料,网上匹配GBK中文的表达式都是使用16进制码通杀中文的那种
例如 "/^[".chr(0xa1)."-".chr(0xff)."]+$/" ,依然会把C 这样的的字符匹配进去
测试代码如下:
测试结果:
去维基百科查阅相关资料 ,GBK的编码范围如下:
根据资料继续查阅GBK码表 ,
前面提供的表达式是从A1就开始了,而A1-A9正好就是符号段,难怪会匹配到
排除符号段后就可以得出中文字符的码段为0xB0 - 0xF7,0x81 - 0xA0, 0xAA - 0xFE
按照编码标准,中文字由两个字节组成,那么我们按照标准建立正则表达式
(([\xB0-\xF7][\xA1-\xFE])|([\x81-\xA0][\x40-\xFE])|([\xAA-\xFE][\x40-\xA0])|(\w))+
测试代码如下:
运行结果,成功匹配中文字符,问题解决
Android查看sqlite数据库内容的方法 [Android]
post by 朦朧中的罪惡 / 2010-6-10 20:24 Thursday
Android中可以采用sqlite数据裤来存储数据,是Google却没有直接给我们提供相关工具来管理数据库里的数据。
如果不能直接通过工具来查看,那我们就把数据库从手机/模拟器里面拷贝出来用工具查看,下面是步骤
1.确认数据库的位置
我们可以通过eclipse的DDMS插件来访问手机的部分目录
数据库文件位于/data/data/你的程序的包名/databases/中,下图是一个例子
2.拷贝出数据库文件
我们可以用adb工具来下载数据库文件
命令为 adb push 手机路径 本地路径
例如我要把项目下的test.db数据拷贝到我的桌面,那么运行命令
./adb pull /data/com.test/databases/test.db ~/Desktop/
3.打开数据库文件
这里不用多说,去sqlite官方 选一款软件来读取和管理数据即可
4.更新数据库文件
同样使用adb工具上传
命令为 adb push 本地路径 手机路径
./adb push ~/Desktop/alaTest.db /data/data/com.test/databases/test.db
PHP解析XML异常问题解决 [PHP]
post by 朦朧中的罪惡 / 2010-6-10 10:38 Thursday
今天在调试emlog工具箱导入rss文件时php报错
内容为
Char 0x0 out of allowed range in Entity
Google搜索相关资料无果。郁闷了半天,后来突然想到Char 0x0,觉得这个应该是rss文本中含有非法的字符而导致xml解析失败.
查询了w3.org的xml字符范围 之后
上面定义了有效的uncode字符范围:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
虽然0x0可以存在于utf-8文件中,但是0x0很明显不在上面规定范围之内
那么我只需要把文档里面不符合上面标准的字符过滤掉应该就能解决这个问题
php函数如下
在解析xml之前使用该函数来过滤掉非法字符,就能解决xml解析异常的问题了
参考资料
Invalid XML Characters: when valid UTF8 does not mean valid XML
PHP识别url重写请求 [PHP]
post by 朦朧中的罪惡 / 2010-6-9 10:28 Wednesday
现在很多PHP程序都使用了url重写技术来优化url,但是有时候我们要在PHP程序中区分默认url的请求和url重写后的请求,这该如何处理呢?
我的解决方案是在常量$_SERVER里面找答案,在不同的服务器中$_SERVER都会有一个索引用来记录重写请求访问重写之前的路径
根据我的测试,部分主流服务器的索引如下
IIS7 + Rewrite Module -> $_SERVER['HTTP_X_ORIGINAL_URL']
IIS6 + ISAPI Rewite -> $_SERVER['HTTP_X_REWRITE_URL’]
Apache2 -> $_SERVER['REQUEST_URI’] 或 $_SERVER['REDIRECT_URL']
nginx -> $_SERVER['REQUEST_URI’]
有了这个参数,我们就可以在PHP中来判断请求url来自于重写地址的还是默认格式的地址了





















