Home > GAE和编程 > Python实现字符串全角半角转换

Python实现字符串全角半角转换

October 18th, 2010 发表评论 阅读评论

全角字符unicode编码范围65281~65374 (十六进制 0xFF01 ~ 0xFF5E),半角字符unicode编码范围33~126 (十六进制 0x21~ 0x7E)。空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)

而且除空格外,全角/半角按unicode编码排序在顺序上是对应的所以可以直接通过用+-法来处理非空格数据,对空格单独处理。

全角转半角

def strQ2B(ustring):
    """把字符串全角转半角"""
    rstring = ""
    for uchar in ustring:
        inside_code=ord(uchar)
        if inside_code==0x3000:
            inside_code=0x0020
        else:
            inside_code-=0xfee0
        if inside_code<0x0020 or inside_code>0x7e:      #转完之后不是半角字符则返回原来的字符
            rstring += uchar
        rstring += unichr(inside_code)
    return rstring

半角转全角

def strB2Q(ustring):
    """把字符串半角转全角"""
    rstring = ""
    for uchar in ustring:
        inside_code=ord(uchar)
        if inside_code<0x0020 or inside_code>0x7e:      #不是半角字符则返回原来的字符
            rstring += uchar
        if inside_code==0x0020: #除了空格其他的全角半角的公式为:半角=全角-0xfee0
            inside_code=0x3000
        else:
            inside_code+=0xfee0
        rstring += unichr(inside_code)
    return rstring

另外的实现方法:

def b2q(ustr):
        return ''.join(unichr(0x3000 if c == 0x0020 else c+0xfee0 if 0x0020 < c < 0x0080 else c) for c in map(ord, ustr))

def q2b(ustr):
        return ''.join(unichr(0x0020 if c == 0x3000 else c-0xfee0 if 0xff00 < c < 0xff80 else c) for c in map(ord, ustr))

释义:

(1)全角---指一个字符占用两个标准字符位置。
汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。一般的系统命令是不用全角字符的,只是在作文字处理时才会使用全角字符。
(2)半角---指一字符占用一个标准的字符位置。
ASCII方式的字符,通常的英文字母、数字键、符号键都是半角的,半角的显示内码都是一个字节。在系统内部,以上三种字符是作为基本代码处理的,所以用户输入命令和参数时一般都使用半角。
        全角与半角有什么区别?各在什么情况下使用?
全角占两个字节,半角占一个字节。
半角全角主要是针对标点符号来说的,全角标点占两个字节,半角占一个字节,而不管是半角还是全角,汉字都还是要占两个字节
在编程序的源代码中只能使用半角标点(不包括字符串内部的数据)。

转载请以超链接注明来自  云在天边看世界
本文永久链接  http://www.tangblog.info/2010/10/18/python-sbc-case-to-dbc-case.html

分类: GAE和编程 标签:

  1. avatar
    alan 2011-04-03 at 23:20 |#15

    if inside_code0x7e: #转完之后不是半角字符则返回原来的字符
    rstring += uchar
    else:
    rstring += unichr(inside_code)
  2. avatar
    guest 2010-12-05 at 11:46 |#14

    原来全角跟半角还有字节大小之分,学习了。
  3. avatar
    guest 2010-11-29 at 14:48 |#13

    哇,谢谢分享。你总是分享好东西好方法。
  4. avatar
    Lambert 2010-10-29 at 10:10 |#12

    恩,做批处理不错
  5. avatar
    dengmin 2010-10-22 at 21:26 |#11

    @Angel是该好好系统的学习一下python
  6. avatar
    云在天边 2010-10-22 at 14:11 |#10

    @Angel
    导航栏使用的lavalamp,很早以前就用的是这个,后来又换成上下滑动的,但那个滑动的浏览器兼容性有问题,所以我又把lavalamp换回了
  7. avatar
    Angel 2010-10-22 at 10:21 |#9

    哈哈,学习了, 字符串的转换,在python中 能看懂,写不出来= = !
    还有,导航栏的效果不错。。
  8. avatar
    云在天边 2010-10-21 at 21:41 |#8

    @dengmin
    这样啊,我正在研究gae的自定义域名的问题,刚测试一下,感觉可以了,但是使用代理的ghs可能认不出来,囧
  9. avatar
    dengmin 2010-10-21 at 21:36 |#7

    @云在天边
    pingback还没有开始,昨天该了一个自定义链接 今天有做了一个头像缓存
    这个功能看看也马上就要开始了
  10. avatar
    云在天边 2010-10-21 at 21:32 |#6

    @dengmin
    你一直在忙你的新网站啊,赶快把pingback弄好,咱们来测试一下连通性,哈哈
  11. avatar
    dengmin 2010-10-21 at 21:26 |#5

    哎呀 没有做上沙发
  12. avatar
    云在天边 2010-10-21 at 16:47 |#4

    @Mucid
    什么压力啊?
  13. avatar
    Mucid 2010-10-21 at 13:08 |#3

    哎呀,我表示鸭梨很大很大。。
  14. avatar
    云在天边 2010-10-21 at 12:26 |#2

    @Code之行人
    在文字操作时可能有用处的
  15. avatar
    Code之行人 2010-10-21 at 09:22 |#1

    这个先收藏起来啊。也许真的用得上
Comment pages
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
/static/smilies/icon_twisted.gif /static/smilies/icon_smile.gif /static/smilies/icon_cry.gif /static/smilies/icon_question.gif /static/smilies/icon_razz.gif /static/smilies/icon_mrgreen.gif /static/smilies/icon_sad.gif /static/smilies/icon_evil.gif /static/smilies/icon_exclaim.gif /static/smilies/icon_redface.gif /static/smilies/icon_biggrin.gif /static/smilies/icon_surprised.gif /static/smilies/icon_eek.gif /static/smilies/icon_confused.gif /static/smilies/icon_cool.gif /static/smilies/icon_lol.gif /static/smilies/icon_mad.gif /static/smilies/icon_rolleyes.gif /static/smilies/icon_wink.gif /static/smilies/icon_idea.gif /static/smilies/icon_arrow.gif /static/smilies/icon_neutral.gif
capacha 请输入验证码(不区分大小写)