Memcache协议中文版 三月 17th, 2009

Memcache协议中文版

写在前头
偶然之间看到本文的中英文对照版本,感觉看起来不是很方便,于是花费了半个小时的时间,仔细整理出了独立的中文版本,并记录下来。

协议
memcached 的客户端使用TCP链接 与 服务器通讯。(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的memcached服务器监视一些(可设置)端口。客户端连接这些端口,发送命令到服务器,读取回应,最后关闭连接。

结束会话不需要发送任何命令。当不再需memcached服务时,要客户端可以在任何时候关闭连接。需要注意的是,鼓励客户端缓存这些连接,而不是 每次需要存取数据时都重新打开连接。这是因为memcached 被特意设计成及时开启很多连接也能够高效的工作(数百个,上千个如果需要的话)。缓存这些连接,可以消除建立连接所带来的开销(/*/相对而言,在服务器 端建立一个新连接的准备工作所带来的开销,可以忽略不计。)。

 

在memcache协议中发送的数据分两种:文本行 和 自由数据。 文本行被用于来自客户端的命令和服务器的回应。自由数据用于客户端从服务器端存取数据时。同样服务器会以字节流的方式传回自由数据。/*/服务器不用关心 自由数据的字节顺序。自由数据的特征没有任何限制;但是通过前文提到的文本行,这项数据的接受者(服务器或客户端),便能够精确地获知所发送的数据库的长 度。

文本行固定以“\r\n”(回车符紧跟一个换行符)结束。 自由数据也是同样会以“\r\n”结束,但是 \r(回车符)、\n(换行符),以及任何其他8位字符,均可出现在数据中。因此,当客户端从服务器取回数据时,必须使用数据区块的长度来确定数据区块的 结束位置,而不要依据数据区块末尾的“\r\n”,即使它们固定存在于此。

键值
存储在memcached中的数据通过键值来标识。键值是一个文本字符串,对于需要存取这项数据的客户端而言,它必须是唯一的。键值当前的长度限制设定为250字符(当然,客户端通常不会用到这么长的键);键值中不能使用制表符和其他空白字符(例如空格,换行等)。

命令
所有命令分为3种类型:
存储命令(有3项:’set’、’add’、’repalce’)指示服务器储存一些由键值标识的数据。客户端发送一行命令,后面跟着数据区块;然后,客户端等待接收服务器回传的命令行,指示成功与否。
取回命令(只有一项:’get’)指示服务器返回与所给键值相符合的数据(一个请求中右一个或多个键值)。客户端发送一行命令,包括所有请求的键值;服务 器每找到一项内容,都会发送回客户端一行关于这项内容的信息,紧跟着是对应的数据区块;直到服务器以一行“END”回应命令结束。
/*?*/其他的命令都不能携带自由数据。在这些命令中,客户端发送一行命令,然后等待(由命令所决定)一行回应,或最终以一行“END”结束的多行命令。

一行命令固定以命令名称开始,接着是以空格隔开的参数(如果有参数的话)。命令名称大小写敏感,并且必须小写。一些客户端发送给服务器的命令会包含 一些时限(针对内容或客户端请求的操作)。这时,时限的具体内容既可以是Unix时间戳(从1970年1月1日开始的秒钟数),或当前时间开始的秒钟数。 对后者而言,不能超过 60*60*24*30(30天);如果超出,服务器将会理解为Unix时间戳,而不是从当前时间起的秒偏移。

错误字串
每一个由客户端发送的命令,都可能收到来自服务器的错误字串回复。这些错误字串会以三种形式出现:
- “ERROR\r\n”
意味着客户端发送了不存在的命令名称。
- “CLIENT_ERROR <error>\r\n”
意味着输入的命令行里存在一些客户端错误,例如输入未遵循协议。<error>部分是人类易于理解的错误解说……
- “SERVER_ERROR <error>\r\n”
意味着一些服务器错误,导致命令无法执行。<error>部分是人类易于理解的错误解说。在一些严重的情形下(通常应该不会遇到),服务器将在发送这行错误后关闭连接。这是服务器主动关闭连接的唯一情况。
在后面每项命令的描述中,这些错误行不会再特别提到,但是客户端必须考虑到这些它们存在的可能性。

存储命令
首先,客户端会发送一行像这样的命令:
<command name> <key> <flags> <exptime> <bytes>\r\n
- <command name> 是 set, add, 或者 repalce

  • set 意思是 “储存此数据”
  • add 意思是 “储存此数据,只在服务器*未*保留此键值的数据时”
  • replace意思是 “储存此数据,只在服务器*曾*保留此键值的数据时”

- <key> 是接下来的客户端所要求储存的数据的键值
- <flags> 是在取回内容时,与数据和发送块一同保存服务器上的任意16位无符号整形(用十进制来书写)。客户端可以用它作为“位域”来存储一些特定的信息;它对服务器是不透明的。
- <exptime> 是终止时间。如果为0,该项永不过期(虽然它可能被删除,以便为其他缓存项目腾出位置)。如果非0(Unix时间戳或当前时刻的秒偏移),到达终止时间后,客户端无法再获得这项内容。
- <bytes> 是随后的数据区块的字节长度,不包括用于分野的“\r\n”。它可以是0(这时后面跟随一个空的数据区块)。

在这一行以后,客户端发送数据区块。
<data block>\r\n
- <data block> 是大段的8位数据,其长度由前面的命令行中的<bytes>指定。

发送命令行和数据区块以后,客户端等待回复,可能的回复如下:
- “STORED\r\n”
表明成功.
- “NOT_STORED\r\n”
表明数据没有被存储,但不是因为发生错误。这通常意味着add 或 replace命令的条件不成立,或者,项目已经位列删除队列(参考后文的“delete”命令)。

取回命令
一行取回命令如下:
get <key>*\r\n
- <key>* 表示一个或多个键值,由空格隔开的字串
这行命令以后,客户端的等待0个或多个项目,每项都会收到一行文本,然后跟着数据区块。所有项目传送完毕后,服务器发送以下字串:
“END\r\n”
来指示回应完毕。
服务器用以下形式发送每项内容:
VALUE <key> <flags> <bytes>\r\n
<data block>\r\n
- <key> 是所发送的键名
- <flags> 是存储命令所设置的记号
- <bytes> 是随后数据块的长度,*不包括* 它的界定符“\r\n”
- <data block> 是发送的数据

如果在取回请求中发送了一些键名,而服务器没有送回项目列表,这意味着服务器没这些键名(可能因为它们从未被存储,或者为给其他内容腾出空间而被删除,或者到期,或者被已客户端删除)。

删除
命令“delete”允许从外部删除内容:
delete <key> <time>\r\n
- <key> 是客户端希望服务器删除的内容的键名
- <time> 是一个单位为秒的时间(或代表直到某一刻的Unix时间),在该时间内服务器会拒绝对于此键名的“add”和“replace”命令。此时内容被放入 delete队列,无法再通过“get”得到该内容,也无法是用“add”和“replace”命令(但是“set”命令可用)。直到指定时间,这些内容 被最终从服务器的内存中彻底清除。
<time>参数 是可选的,缺省为0(表示内容会立刻清除,并且随后的存储命令均可用)。
此命令有一行回应:
- “DELETED\r\n”
表示执行成功
- “NOT_FOUND\r\n”
表示没有找到这项内容

参考随后的“flush_all”命令使所有内容无效

增加/减少
命令 “incr” 和 “decr”被用来修改数据,当一些内容需要 替换、增加 或减少时。这些数据必须是十进制的32位无符号整新。如果不是,则当作0来处理。修改的内容必须存在,当使用“incr”/“decr”命令修改不存在的 内容时,不会被当作0处理,而是操作失败。

客户端发送命令行:
incr <key> <value>\r\n

decr <key> <value>\r\n
- <key> 是客户端希望修改的内容的建名
- <value> 是客户端要增加/减少的总数。

回复为以下集中情形:
- “NOT_FOUND\r\n”
指示该项内容的值,不存在。
- <value>\r\n ,<value>是 增加/减少 。
注意”decr”命令发生下溢:如果客户端尝试减少的结果小于0时,结果会是0。”incr” 命令不会发生溢出。

状态
命令”stats” 被用于查询服务器的运行状态和其他内部数据。有两种格式。不带参数的:
stats\r\n
这会在随后输出各项状态、设定值和文档。另一种格式带有一些参数:
stats <args>\r\n
通过<args>,服务器传回各种内部数据。因为随时可能发生变动,本文不提供参数的种类及其传回数据。

各种状态
受到无参数的”stats”命令后,服务器发送多行内容,如下:
STAT <name> <value>\r\n
服务器用以下一行来终止这个清单:
END\r\n
在每行状态中,<name> 是状态的名字,<value> 使状态的数据。 以下清单,是所有的状态名称,数据类型,和数据代表的含义。
在“类型”一列中,”32u”表示32位无符号整型,”64u”表示64位无符号整型,”32u:32u”表示用冒号隔开的两个32位无符号整型。

名称 类型 含义
pid 32u 服务器进程ID
uptime 32u 服务器运行时间,单位秒
time 32u 服务器当前的UNIX时间
version string 服务器的版本号
rusage_user 32u:32u 该进程累计的用户时间
(秒:微妙)
rusage_system 32u:32u 该进程累计的系统时间
(秒:微妙)
curr_items 32u 服务器当前存储的内容数量
total_items 32u 服务器启动以来存储过的内容总数
bytes 64u 服务器当前存储内容所占用的字节数
curr_connections 32u 连接数量
total_connections 32u 服务器运行以来接受的连接总数
connection_structures 32u 服务器分配的连接结构的数量
cmd_get 32u 取回请求总数
cmd_set 32u 存储请求总数
get_hits 32u 请求成功的总次数
get_misses 32u 请求失败的总次数
bytes_read 64u 服务器从网络读取到的总字节数
bytes_written 64u 服务器向网络发送的总字节数
limit_maxbytes 32u 服务器在存储时被允许使用的字节总数

其它命令
“flush_all”命令有一个可选的数字参数。它总是执行成功,服务器会发送“OK\r\n”回应。它的效果是使已经存在的项目立即失效(缺省),或 在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行。flush_all 效果具体如下:它导致所有更新时间早于flush_all所设定时间的项目,在被执行取回命令时命令被忽略。
“version”命令没有参数:
version\r\n
在回应中,服务器发送:
“VERSION <version>\r\n”
<version> 是服务器的版本字串。
“quit”命令没有参数:
quit\r\n
接收此命令后,服务器关闭连接。不过,客户端可以在不再需要时,简单地关闭连接就行,并不一定需要发送这个命令。

UDP 协议
当来自客户端的连接数远大于TCP连接的上限时,可以使用基于UDP的接口。UDP接口不能保证传输到位,所以只有在不要求成功的操作中使用;比如被用于一个“get”请求时,会因不当的缓存处理而发生错误或回应有遗失。

每个UDP数据包都包含一个简单的帧头,数据之后的内容与TCP协议的描述类似。在执行所产生的数据流中,请求必须被包含在单独的一个UDP数据包中,但是回应可能跨越多个数据包。(只有“get”和“set”请求例外,跨越了多个数据包)

帧头有8字节长,如下(均由16位整数组成,网络字节顺序,高位在前):

  • 0-1 请求ID
  • 2-3 序号
  • 4-5 该信息的数据包总数
  • 6-7 保留位,必须为0

请求ID有客户端提供。一般它会是一个从随机基数开始的递增值,不过客户端想用什么样的请求ID都可以。服务器的回应会包含一个和请求中的同样的 ID。客户端使用请求ID来区分每一个回应。任何一个没有请求ID的数据包,可能是之前的请求遭到延迟而造成的,应该被丢弃。序号的返回是从0到n- 1,n是该条信息的数据包数量。

结束的话
原文最早的出处可能是在http://www.alee2002.com/1这里,然后博乐转载了,再然后我在车东的blog看到了。如果你对Memcache有更多的兴趣,可以参考下列文章:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html
Memcache基础教程:http://www.ccvita.com/259.html
Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html
Memcache协议中文版:http://www.ccvita.com/306.html

Posted in | Comments(0)»

MIT计算机教程 三月 13th, 2009

 

《算法导论》是经典和权威的算法方面的专著 ,现在可以在网上听课了

http://www.youtube.com/user/MIT

Posted in | Comments(0)»

hibernate使用ASM3.1 二月 24th, 2009

在使用jersey过程中发现启动时候报错,原因是使用了ASM3.1,但是hibernate 用的是ASM1.5.3。

解决办法:

修改pom

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.1.ga</version>
<exclusions>
<exclusion>
<artifactId>asm</artifactId>
<groupId>asm</groupId>
</exclusion>
<exclusion>
<artifactId>asm-attrs</artifactId>
<groupId>asm</groupId>
</exclusion>
</exclusions>

</dependency>

cglib2。2 会依赖 ASM3.1

 

 

Tags: hibernate

Posted in | Comments(0)»

jira+confluence安装 一月 21st, 2009

1.安装好jdk,并配置好JAVA_HOME,path,classpath三个环境变量,不知道如何配置的话可以上网上搜一下,很多的,我用的是JDK1.5,最好用新版本的,不然的话可能有些不支持.

2.安装mysql5.0,并新建一个jiradb数据库,为了很好的支持中文,编码都选择utf8

,我的用户名密码都是root,一下会用到;不会的可到www.mysql.cn上面下载,软件和安装文档都有,你也可以用mysql-front来通过界面化操作数据库.

3.http://www.atlassian.com/software/jira/JIRADownloadCenter.jspa下载jira-3.11 Enterprise - Standalone +confluence-2.6.0,解压到指定目录,整个应用都在\atlassian-jira-enterprise-3.11-standalone,你可以把它拷到指定的地方,以下简称jira,我拷到了D盘根目录下,它自带了一个tomcat5.5的服务器.

4. 打开 jira目录\atlassian-jira\WEB-INF\classes\entityengine.xml ,将 field-type-name“hsql” 改成 field-type-name= “mysql” ;并删除schema-name="PUBLIC",

5. 修改 jira目录\conf\server.xml

这大段修改为:

username="root"
password="
密码"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/jiradb?autoReconnect=true&useUnicode=true&characterEncoding=UTF8&mysqlEncoding=utf8"
maxActive="20" />

主意:删掉了里面的minEvictableIdleTimeMillis="4000"
timeBetweenEvictionRunsMillis="5000"

因为可能对mysql的功能有些限制.

6. jira目录\bin\startup.bat启动tomcat,然后在浏览器中输入http://localhost:8080就可以见到安装页面了,注册码可以点击"在线"生成一个,可以使用一个月,网上也有破解的,不过这个就不说了,不太光彩.

7.到这里jira就安装成功了,恭喜你,可以使用了!

8.confluence整合到jira,http://www.atlassian.com/software/confluence/ConfluenceDownloadCenter.jspa下载confluence2.6.0WAR版本,因为要整合到jira,所以不能用standalone作为一个单独的,当然你如果想分开使用的话,可以用standalone版本,解压后将里面的confluence拷到一个指定的文件夹,为了方便管理,我拷到了我的jira目录下.

9.打开confluence/WEB-INF/classes/confluence-init.properties,confluence.home前面的注释(#)去掉,后面改为你存放数据的路径,:

d:/confluence/data.

10.jiraconf/Catalina/localhost 文件夹下创建一个confluence.xml文件,里面

加入如下内容:

"/confluence" docBase="c:/applications/confluence-2.1.3/confluence" debug="0" reloadable="true">
 "org.apache.catalina.logger.FileLogger" prefix="atlassian-confluence." suffix=".log" timestamp="true"/>
 
docBase指你的confluence存放位置,:d:/atlassian-jira-enterprise-3.11-standalone/confluence
11.编辑jirabin/setenv.sh/bat (.sh on unix, .bat on windows)文件,
JAVA_OPTS=... " 后加入 -XX:MaxPermSize=128m .
:如果用的非sunjvm,其就不用修改了.  
12.编辑conf/Catalina/localhost 下的confluence.xml文件,改为如下:
 



     username="root"

     password="
密码"

     driverClassName="com.mysql.jdbc.Driver"

     url="jdbc:mysql://localhost/jiradb?autoReconnect=true"/>




13.重启服务器,在浏览器输入:http://localhost:8080/confluence,进行配置,选定制
安装,数据库选mysql......
14.配置好后,打开/confluence/WEB-INF/classes 下的osuser.xml文件,
"bucket.user.providers.CachingCredentialsProvider">
         "chain.classname">com.opensymphony.user.provider.hibernate.HibernateCredentialsProvider
         "chain.configuration.provider.class">bucket.user.BucketHibernateConfigProvider
     
     "bucket.user.providers.CachingAccessProvider">
         "chain.classname">com.opensymphony.user.provider.hibernate.HibernateAccessProvider
         "chain.configuration.provider.class">bucketuser.BucketHibernateConfigProvider
     
     "bucket.user.providers.CachingProfileProvider">
         "chain.classname">com.opensymphony.user.provider.hibernate.HibernateProfileProvider
         "chain.configuration.provider.class">bucket.user.BucketHibernateConfigProvider
     
注释掉;
并将
"bucket.user.providers.CachingCredentialsProvider">
         "chain.classname">com.atlassian.confluence.user.providers.jira.JiraJdbcCredentialsProvider
         "chain.datasource">java:comp/env/jdbc/JiraDS
     
     "bucket.user.providers.CachingAccessProvider">
         "chain.classname">com.atlassian.confluence.user.providers.jira.JiraJdbcAccessProvider
         "chain.datasource">java:comp/env/jdbc/JiraDS
     
     "bucket.user.providers.CachingProfileProvider">
         "chain.classname">com.atlassian.confluence.user.providers.jira.JiraJdbcProfileProvider
         "chain.datasource">java:comp/env/jdbc/JiraDS
         "chain.configuration.provider.class">bucket.user.BucketHibernateConfigProvider
     
取消注释.
15.用管理员登陆jira,分别增加confluence-users confluence-administrators 两个用户组,并把管理员加到两个组里面.
16.jira管理员进入confluence, 

进入 Administration Console 面板并点击 General Configuration 在左导航里,
点击 'Edit' 按钮在'Options and Settings' 附近. 

'External User Management'选项选择 'ON' .
(管理---总体配置---安全和隐私右边点"编辑"---外部用户管理---启用)
 
17.恭喜你,配置成功,现在可以使用jiraconfluence,并且使用的是同一个用户组,
如果写的有什么错误的话还请大家批评指正,有什么不清楚的话大家可以互相探讨.
如果找不到语言包或其它的话,可以留下邮箱,发给你一份.

参考文档:

http://confluence.atlassian.com/display/DOC/Delegate+user+management+to+use+JIRA+logins

http://www.netociety.com/display/DOC/Database+Setup+For+mySQL?showComments=true&showCommentArea=true

Posted in | Comments(0)»

写了一个ant 脚本deploy一个java项目出现 “非法字符: \65279“

项目是统一UTF-8编码,用eclipse 发布却没有这个问题。

原因:
windows对UTF-8文件进行了特殊处理,即对UTF-8的文本文件自动在前面加了两个byte(FF FE);javac编译时,读到最前面这两个byte时报错 illegal character: \65279

unix/linux下标准的UTF-8文件无此两个byte

解决方式:
方案一:16进制文本编辑工具删掉文件头附加的byte即可

Bless 是一个十六进制编辑器,其主要功能包括:支持编辑大数据文件及块设备、能够执行搜索与替换操作、具有类似 Firefox 的标签浏览特性、可将数据输出为文本或 HTML、包含插件系统,等等。

Posted in | Comments(0)»

 

不知道怎么回事,这几天svn罢工了,提交5个文件以上会出现

svn: 没有到主机的路由
svn: OPTIONS request failed on '/code/new/trunk/testsvn/src'

 

搜索google,奇怪没人出现类似问题,只好自己想办法了

因为,终端下 svn能work 。首先,从eclipse svn插件开始找问题,下了最新的eclipse 3.4 安装了 subeclipse  m2eclipse. 结果令人失望,提交的时候出现同样的错误。

终端下 svn能work,但是 eclipse 确不行,很难把问题想到服务器上去,没办法只能从服务端上去查这个问题。

ping svn 的host domain 都没有问题。

升级一下 subversion 试试 ,结果把svn 升级到 1.5.4 还是 出现同样的错误。“要哭了”

过了一个晚上,换了换脑经,svn: 没有到主机的路由,no route to host ,不会是前端的iptables 做了什么限制。

sudo iptables -L


ACCEPT     tcp  --  anywhere             anywhere            tcp flags:SYN,RST,ACK/SYN limit: avg 3/sec burst 5

--limit 3/sec --limit-burst 5 ,意思是开始时有5个通行证,用完之后每20秒增加一个(这就是从iptables的角度看的,要是以用户的角度看,说法就是每一秒钟增加三个或者每钟只能过三个)

找到问题,把 --limit-burst 设置成 50 重启iptables 果然可以了。

 

参考 http://cha.homeip.net/blog/archives/2006/03/iptables_limit.html

 

Posted in | Comments(0)»

SOA中协议和接口 一月 15th, 2009

SOA 实践ESB 章节中提到protocol-Driven Versus API-Driven ESB

 

为了弄清楚这个概念问题找了些资料

 

【术语:

  1. 协议 — 协议包含了数据格式,同时规定了行为等方面的内容,例如邮件协议,RPC协议。
  2. 格式 — 对信息的编码。例如:XML格式。
  3. 接口方式 — 指程序接口调用实现业务交换的方式。例如:java API调用。
  4. 协议方式 — 通过某种报文(信息是满足格式的)实现业务交换的方式。例如:收邮件,发邮件。

google 的OpenSocial

 

和facebook 的API

都是 基于REST API

Tags: soa

Posted in soa | Comments(0)»

Python-String-Function

字符串中字符大小写的变换:

* S.lower()   #小写
* S.upper()   #大写
* S.swapcase()   #大小写互换
* S.capitalize()   #首字母大写
* String.capwords(S) 
#这是模块中的方法。它把S用split()函数分开,然后用capitalize()把首字母变成大写,最后用join()合并到一起
* S.title()    #只有首字母大写,其余为小写,模块中没有这个方法

字符串在输出时的对齐:

* S.ljust(width,[fillchar]) 
#输出width个字符,S左对齐,不足部分用fillchar填充,默认的为空格。
* S.rjust(width,[fillchar])    #右对齐
* S.center(width, [fillchar])    #中间对齐
* S.zfill(width)   #把S变成width长,并在右对齐,不足部分用0补足

字符串中的搜索和替换:

* S.find(substr, [start, [end]]) 
#返回S中出现substr的第一个字母的标号,如果S中没有substr则返回-1。start和end作用就相当于在S[start:end]中搜索
* S.index(substr, [start, [end]]) 
#与find()相同,只是在S中没有substr时,会返回一个运行时错误
* S.rfind(substr, [start, [end]]) 
#返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回-1,也就是说从右边算起的第一次出现的substr的首字母标号
* S.rindex(substr, [start, [end]])
* S.count(substr, [start, [end]])    #计算substr在S中出现的次数
* S.replace(oldstr, newstr, [count])  
#把S中的oldstar替换为newstr,count为替换次数。这是替换的通用形式,还有一些函数进行特殊字符的替换
* S.strip([chars])
#把S中前后chars中有的字符全部去掉,可以理解为把S前后chars替换为None
* S.lstrip([chars])
* S.rstrip([chars])
* S.expandtabs([tabsize]) 
#把S中的tab字符替换没空格,每个tab替换为tabsize个空格,默认是8个

字符串的分割和组合:

* S.split([sep, [maxsplit]])
#以sep为分隔符,把S分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符
* S.rsplit([sep, [maxsplit]])
* S.splitlines([keepends])
#把S按照行分割符分为一个list,keepends是一个bool值,如果为真每行后而会保留行分割符。
* S.join(seq) #把seq代表的序列──字符串序列,用S连接起来

字符串的mapping,这一功能包含两个函数:

* String.maketrans(from, to)
#返回一个256个字符组成的翻译表,其中from中的字符被一一对应地转换成to,所以from和to必须是等长的。
* S.translate(table[,deletechars])
#使用上面的函数产后的翻译表,把S进行翻译,并把deletechars中有的字符删掉。需要注意的是,如果S为unicode字符串,那么就不支持 deletechars参数,可以使用把某个字符翻译为None的方式实现相同的功能。此外还可以使用codecs模块的功能来创建更加功能强大的翻译 表。

字符串还有一对编码和解码的函数:

* S.encode([encoding,[errors]])
#其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib big5 bzse64等都支持。errors默认值为"strict",意思是UnicodeError。可能的值还有'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 和所有的通过codecs.register_error注册的值。这一部分内容涉及codecs模块,不是特明白
* S.decode([encoding,[errors]])

字符串的测试函数,这一类函数在string模块中没有,这些函数返回的都是bool值:

* S.startwith(prefix[,start[,end]])
#是否以prefix开头
* S.endwith(suffix[,start[,end]])
#以suffix结尾
* S.isalnum()
#是否全是字母和数字,并至少有一个字符
* S.isalpha()  #是否全是字母,并至少有一个字符
* S.isdigit()  #是否全是数字,并至少有一个字符
* S.isspace() #是否全是空白字符,并至少有一个字符
* S.islower() #S中的字母是否全是小写
* S.isupper() #S中的字母是否便是大写
* S.istitle() #S是否是首字母大写的

字符串类型转换函数,这几个函数只在string模块中有:

* string.atoi(s[,base])
#base默认为10,如果为0,那么s就可以是012或0x23这种形式的字符串,如果是16那么s就只能是0x23或0X12这种形式的字符串
* string.atol(s[,base])  #转成long
* string.atof(s[,base])  #转成float

 

引用:http://www.telitchina.com/www/12/2007-07/36.html

Tags: python

Posted in | Comments(0)»