精华内容
下载资源
问答
  • 本文实例讲解了Python实现全角半角转换的方法,相信对于大家的Python学习能够起到一定的参考借鉴价值。如下所示: 一、全角半角转换概述: 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) 半角字符...
  • python 全角半角字符转换

    千次阅读 2018-09-19 19:08:00
    1.相关原理 全角即:Double Byte Character,简称DBC ...全角字符的第一个字节总是被置为 163,而第二个字节则是相同半角字符码加上128(不包括空格,全角空格和半角空格也要考虑进去); 对...

    1.相关原理

    全角即:Double Byte Character,简称DBC
    半角即:Single Byte Character,简称SBC
    在 windows 中,中文和全角字符都占两个字节,并且使用了 ascii chart 2 (codes 128–255);
    全角字符的第一个字节总是被置为 163,而第二个字节则是相同半角字符码加上128(不包括空格,全角空格和半角空格也要考虑进去);
    对于中文来说,它的第一个字节被置为大于163,如’阿’为:176 162,检测到中文时不进行转换。
    例如:半角 a 为 65,则全角 a 是 163(第一个字节)、193(第二个字节,128+65)。

    具体规则为

    • 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
    • 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
    • 空格比较特殊,全角为 12288(0x3000),半角为 32(0x20)
    • 而且除空格外,全角/半角按unicode编码排序在顺序上是对应的(半角 + 65248 = 全角)

    所以可以直接通过用±法来处理非空格数据,对空格单独处理。

    用到的一些函数

    • chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
    • unichr()跟它一样,只不过返回的是Unicode字符。
    • ord()函数是chr()函数或unichr()函数的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值。
      下面做个试验:
    for i in xrange(33,127):
        print i,chr(i),i+65248,unichr(i+65248)
    

    结果如下:

    33 ! 65281 !
    34 " 65282 "
    35 # 65283 #
    36 $ 65284 $
    37 % 65285 %
    38 & 65286 &
    39 ' 65287 '
    40 ( 65288 (
    41 ) 65289 )
    42 * 65290 *
    43 + 65291 +
    44 , 65292 ,
    45 - 65293 -
    46 . 65294 .
    47 / 65295 /
    48 0 65296 0
    49 1 65297 1
    50 2 65298 2
    51 3 65299 3
    52 4 65300 4
    53 5 65301 5
    54 6 65302 6
    55 7 65303 7
    56 8 65304 8
    57 9 65305 9
    58 : 65306 :
    59 ; 65307 ;
    60 < 65308 <
    61 = 65309 =
    62 > 65310 >
    63 ? 65311 ?
    64 @ 65312 @
    65 A 65313 A
    66 B 65314 B
    67 C 65315 C
    68 D 65316 D
    69 E 65317 E
    70 F 65318 F
    71 G 65319 G
    72 H 65320 H
    73 I 65321 I
    74 J 65322 J
    75 K 65323 K
    76 L 65324 L
    77 M 65325 M
    78 N 65326 N
    79 O 65327 O
    80 P 65328 P
    81 Q 65329 Q
    82 R 65330 R
    83 S 65331 S
    84 T 65332 T
    85 U 65333 U
    86 V 65334 V
    87 W 65335 W
    88 X 65336 X
    89 Y 65337 Y
    90 Z 65338 Z
    91 [ 65339 [
    92 \ 65340 \
    93 ] 65341 ]
    94 ^ 65342 ^
    95 _ 65343 _
    96 ` 65344 `
    97 a 65345 a
    98 b 65346 b
    99 c 65347 c
    100 d 65348 d
    101 e 65349 e
    102 f 65350 f
    103 g 65351 g
    104 h 65352 h
    105 i 65353 i
    106 j 65354 j
    107 k 65355 k
    108 l 65356 l
    109 m 65357 m
    110 n 65358 n
    111 o 65359 o
    112 p 65360 p
    113 q 65361 q
    114 r 65362 r
    115 s 65363 s
    116 t 65364 t
    117 u 65365 u
    118 v 65366 v
    119 w 65367 w
    120 x 65368 x
    121 y 65369 y
    122 z 65370 z
    123 { 65371 {
    124 | 65372 |
    125 } 65373 }
    126 ~ 65374 ~
    

    2. 相关代码

    2.1 全角转半角

    def full2half(s):
        n = []
        s = s.decode('utf-8')
        for char in s:
            num = ord(char)
            if num == 0x3000:
                num = 32
            elif 0xFF01 <= num <= 0xFF5E:
                num -= 0xfee0
            num = unichr(num)
            n.append(num)
    return ''.join(n)
    

    2.2 半角转全角

    def half2full(s):
        n = []
        s = s.decode('utf-8')
        for char in s:
            num = char(char)
            if num == 320:
                num = 0x3000
            elif 0x21 <= num <= 0x7E:
                num += 0xfee0
            num = unichr(num)
            n.append(num)
    return ''.join(n)
    

    2.3 自定义转换

    上面的实现方式非常的简单,但是现实情况下可能并不会把所以的字符统一进行转换,比如中文文章中我们期望将所有出现的字母和数字全部转化成半角,而常见标点符号统一使用全角,上面的转化就不适合了。解决方案,是自定义词典。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    FH_SPACE = FHS = ((u" ", u" "),)
    FH_NUM = FHN = (
        (u"0", u"0"), (u"1", u"1"), (u"2", u"2"), (u"3", u"3"), (u"4", u"4"),
        (u"5", u"5"), (u"6", u"6"), (u"7", u"7"), (u"8", u"8"), (u"9", u"9"),
    )
    FH_ALPHA = FHA = (
        (u"a", u"a"), (u"b", u"b"), (u"c", u"c"), (u"d", u"d"), (u"e", u"e"),
        (u"f", u"f"), (u"g", u"g"), (u"h", u"h"), (u"i", u"i"), (u"j", u"j"),
        (u"k", u"k"), (u"l", u"l"), (u"m", u"m"), (u"n", u"n"), (u"o", u"o"),
        (u"p", u"p"), (u"q", u"q"), (u"r", u"r"), (u"s", u"s"), (u"t", u"t"),
        (u"u", u"u"), (u"v", u"v"), (u"w", u"w"), (u"x", u"x"), (u"y", u"y"), (u"z", u"z"),
        (u"A", u"A"), (u"B", u"B"), (u"C", u"C"), (u"D", u"D"), (u"E", u"E"),
        (u"F", u"F"), (u"G", u"G"), (u"H", u"H"), (u"I", u"I"), (u"J", u"J"),
        (u"K", u"K"), (u"L", u"L"), (u"M", u"M"), (u"N", u"N"), (u"O", u"O"),
        (u"P", u"P"), (u"Q", u"Q"), (u"R", u"R"), (u"S", u"S"), (u"T", u"T"),
        (u"U", u"U"), (u"V", u"V"), (u"W", u"W"), (u"X", u"X"), (u"Y", u"Y"), (u"Z", u"Z"),
    )
    FH_PUNCTUATION = FHP = (
        (u".", u"."), (u",", u","), (u"!", u"!"), (u"?", u"?"), (u"”", u'"'),
        (u"’", u"'"), (u"‘", u"`"), (u"@", u"@"), (u"_", u"_"), (u":", u":"),
        (u";", u";"), (u"#", u"#"), (u"$", u"$"), (u"%", u"%"), (u"&", u"&"),
        (u"(", u"("), (u")", u")"), (u"‐", u"-"), (u"=", u"="), (u"*", u"*"),
        (u"+", u"+"), (u"-", u"-"), (u"/", u"/"), (u"<", u"<"), (u">", u">"),
        (u"[", u"["), (u"¥", u"\\"), (u"]", u"]"), (u"^", u"^"), (u"{", u"{"),
        (u"|", u"|"), (u"}", u"}"), (u"~", u"~"),
    )
    FH_ASCII = HAC = lambda: ((fr, to) for m in (FH_ALPHA, FH_NUM, FH_PUNCTUATION) for fr, to in m)
     
    HF_SPACE = HFS = ((u" ", u" "),)
    HF_NUM = HFN = lambda: ((h, z) for z, h in FH_NUM)
    HF_ALPHA = HFA = lambda: ((h, z) for z, h in FH_ALPHA)
    HF_PUNCTUATION = HFP = lambda: ((h, z) for z, h in FH_PUNCTUATION)
    HF_ASCII = ZAC = lambda: ((h, z) for z, h in FH_ASCII())
     
     
    def convert(text, *maps, **ops):
        """ 全角/半角转换
        args:
            text: unicode string need to convert
            maps: conversion maps
            skip: skip out of character. In a tuple or string
            return: converted unicode string
        """
     
        if "skip" in ops:
            skip = ops["skip"]
            if isinstance(skip, basestring):
                skip = tuple(skip)
     
            def replace(text, fr, to):
                return text if fr in skip else text.replace(fr, to)
        else:
            def replace(text, fr, to):
                return text.replace(fr, to)
     
        for m in maps:
            if callable(m):
                m = m()
            elif isinstance(m, dict):
                m = m.items()
            for fr, to in m:
                text = replace(text, fr, to)
        return text
     
     
    if __name__ == '__main__':
        text = u"成田空港—【JR特急成田エクスプレス号・横浜行,2站】—東京—【JR新幹線はやぶさ号・新青森行,6站 】—新青森—【JR特急スーパー白鳥号・函館行,4站 】—函館"
    	print convert(text, FH_ASCII, {u"【": u"[", u"】": u"]", u",": u",", u".": u"。", u"?": u"?", u"!": u"!"}, spit=",。?!“”")
    

    2.4 demo

    fin = open("foward_standard.log",'r')
    fout = open("foward_standard2.log",'w')
    
    lines = fin.readlines()
    
    def strB2Q(ustring):
        """"""
        ustring = ustring.decode('gb18030')
        rstring = ""
        for uchar in ustring:
            inside_code = ord(uchar)
            if inside_code == 32:
                inside_code = 32#12288
            elif inside_code >= 32 and inside_code <= 126:
                inside_code += 65248
    
            rstring += unichr(inside_code)
        #rstring.encode('gb18030')
        return rstring
    
    def transferStr(ustring):
        #ustring = ustring.decode('gb18030')
        try:
            rstring = ""
            for uchar in ustring:
                inside_code=ord(uchar)
                if inside_code == 0x0020 or inside_code==0x3000 or inside_code==0x003f or inside_code==0xff1f:
                    inside_code = 63
                elif inside_code == 12288:
                    inside_code = 32
                elif (inside_code >= 65281 and inside_code <= 65374):
                    inside_code -= 65248
                rstring += unichr(inside_code)
            rstring = rstring.lower()
            return rstring.encode('gb18030')
        except:
            ustring = ustring.lower()
            return ustring.encode('gb18030')
    
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    for line in lines:
        fout.write((strB2Q(line.split("\t")[0])+'\t'+line.split("\t")[1]).encode("gb18030"))
    

    参考文献

    展开全文
  • # 全角半角转换说明 # 有规律(不含空格): # # 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) # 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E) # # 特例: # 空格比较特殊,全角为 ...

    # 转换说明


    # 全角半角转换说明
    # 有规律(不含空格):
    #
    # 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
    # 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
    #


    # 特例:
    # 空格比较特殊,全角为 12288(0x3000),半角为 32(0x20)

    # 正则直接把全角空格替换为半角空格
    text2 = re.sub('\s+', ' ', str1)


    #
    # 除空格外,全角/半角按unicode编码排序在顺序上是对应的(半角 + 0x7e= 全角),所以可以直接通过用+-法来处理非空格数据,对空格单独处理。
    #
    # 注:
    #
    # 1. 中文文字永远是全角,只有英文字母、数字键、符号键才有全角半角的概念,一个字母或数字占一个汉字的位置叫全角,占半个汉字的位置叫半角。

     

    字符串整个替换

    def strQ2B(ustring):
        """全角转半角"""
        rstring = ""
        for uchar in ustring:
            inside_code = ord(uchar)
            print(inside_code)
            if inside_code == 12288:  # 全角空格直接转换
                inside_code = 32
            elif 65281 <= inside_code <= 65374:  # 全角字符(除空格)根据关系转化
                inside_code -= 65248
    
            rstring += unichr(inside_code)
        return rstring
    
    
    def strB2Q(ustring):
        """半角转全角"""
        rstring = ""
        for uchar in ustring:
            inside_code = ord(uchar)
            if inside_code == 32:  # 半角空格直接转化
                inside_code = 12288
            elif 32 <= inside_code <= 126:  # 半角字符(除空格)根据关系转化
                inside_code += 65248
    
            rstring += unichr(inside_code)
        return rstring

     

    展开全文
  • Python实现全角半角转换

    千次阅读 2019-08-08 17:24:37
    直接上代码: def strQ2B(ustring): """ 全角半角 :param ustring: string with encoding utf8 :return: string with encoding utf8 """ ss = [] for s in ustring: rstring = "" ...

    直接上代码:

    
    def strQ2B(ustring):
        """
        全角转半角
        :param ustring: string with encoding utf8
        :return: string with encoding utf8
        """
        ss = []
        for s in ustring:
            rstring = ""
            for uchar in s:
                inside_code = ord(uchar)
                if inside_code == 12288:
                    inside_code = 32
                elif (inside_code >= 65281 and inside_code <= 65374):
                    inside_code -= 65248
                rstring += chr(inside_code)
            ss.append(rstring)
        return ''.join(ss)
    
    
    def strB2Q(ustring):
        """
          半角转全角
          :param ustring: string with encoding utf8
          :return: string with encoding utf8
          """
        ss = []
        for s in ustring:
            rstring = ""
            for uchar in s:
                inside_code = ord(uchar)
                if inside_code == 32:
                    inside_code = 12288
                elif (inside_code >= 33 and inside_code <= 126):
                    inside_code += 65248
                rstring += chr(inside_code)
            ss.append(rstring)
        return ''.join(ss)
    
    
    
    示例:
    from utils.strQB import strQ2B
    
    old_file = open('111.html', 'rb')
    content = old_file.read().decode(encoding='utf-8')
    output_txt = strQ2B(content).encode(encoding='utf-8')
    
    new_file = open('222.html', 'wb')
    new_file.write(output_txt)
    
    old_file.close()
    new_file.close()

     

    展开全文
  • [Python]全角半角转换Python实现

    千次阅读 2014-07-28 10:13:57
    全角半角转换原来 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E) 空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20) ...

    全角半角转换原来

    全角字符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

    测试

    代码

    a = strB2Q("abc12345")
    print a
    b = strQ2B(a)
    print b

    输出:

    abc12345
    abc12345

    参考

    展开全文
  •  转换说明全角半角转换说明有规律(不含空格):全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)特例:空格比较特殊,全角为 12288(0x3000)...
  • 全角半角转换Python实现 ... 全角半角转换Python实现 [Python俱乐部]全角半角转换Python实现全角半角转换原来全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)半角字符unicode编码从33~12...
  • 以输入为GB18030编码字符串为例: ...#把全角字符串转半角 def tobanjiao(string): ustring = string.decode('GB18030') rstring = "" for uchar in ustring: inside_code=ord(uchar) ...
  • 1.全角半角 2.半角全角
  • 在自然语言处理过程中,全角、半角的的不一致会导致信息抽取不...全角半角转换说明 有规律(不含空格): 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) 半角字符unicode编码从33~126 (十六进制 ...
  • 1.应用领域: ...2.全角半角转换概述 全角字符unicode编码范围从65281~65374 (对应的十六进制范围是: 0xFF01 ~ 0xFF5E) 半角字符unicode编码范围从33~126 (对应的十六进制范围从 0x21~ 0x7E) ...
  • python 实现全角半角的相互转换

    千次阅读 2017-08-15 09:28:59
    全角半角转换说明 有规律(不含空格): 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E) 特例: 空格比较特殊,全角为 12288(0x3000),
  • 全角半角转换说明 有规律(不含空格): 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E) 特例: 空格比较特殊,全角为 12288(0x...
  • 全角半角转换说明 有规律(不含空格): 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E) 特例: 空格比较特殊,全角为 12288(0x3000),...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

python全角半角转换

python 订阅