文章目录

  • 1.相关原理
  • 2. 相关代码
    • 2.1 全角转半角
    • 2.2 半角转全角
    • 2.3 自定义转换
    • 2.4 demo
  • 参考文献

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 = 32elif 0xFF01 <= num <= 0xFF5E:num -= 0xfee0num = 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 = 0x3000elif 0x21 <= num <= 0x7E:num += 0xfee0num = 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 convertmaps: conversion mapsskip: skip out of character. In a tuple or stringreturn: 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 textif __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#12288elif inside_code >= 32 and inside_code <= 126:inside_code += 65248rstring += unichr(inside_code)#rstring.encode('gb18030')return rstringdef 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 = 63elif inside_code == 12288:inside_code = 32elif (inside_code >= 65281 and inside_code <= 65374):inside_code -= 65248rstring += 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"))

参考文献

  • 使用Python对全角字符半角字符互转
  • python3实现全角和半角字符转换的方法示例
  • python实现全角半角的相互转换

python 全角半角字符转换相关推荐

  1. java 全角_java 全角半角字符转换的方法实例

    这篇文章主要介绍了java 全角半角字符转换的方法,大家参考使用吧 如果搞明白了Java中全角字符和半角字符之间的关系 那他们之间的转换根本就不是个事. 可以通过下面的程序看看Java中所有字符以及对 ...

  2. python全角半角的相互转换

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

  3. java中全角半角字符的相互转换

    package com.whatycms.common.util;import org.apache.commons.lang.StringUtils;/*** <PRE>* 提供对字符串 ...

  4. java全角半角标点符号转换

    早上发现某个群居然爆出一个bug,上游系统存储的客户简称是商务人员自己填的,这个字段支持用户录入各种字符.但是下游对接的其他系统,在将这个字段应用到系统中的时候,不能支持全角的标点符号,如果这个字段有 ...

  5. php区分全角半角字符,php如何判断是字符串全角还是半角

    php如何判断是字符串全角还是半角 关注:168  答案:2  手机版 解决时间 2021-01-15 16:08 提问者夏日╮悲歌 2021-01-15 00:27 php如何判断是字符串全角还是半 ...

  6. 中英文全角半角括号转换

    Java中文的全角半角以及英文的全角括号都是相同的,但是都和英文半角括号不相同,这个要注意一下.下面是通过维护两个字符数组完成字符替换 String s = "()";String ...

  7. java处理全角半角字符问题

    1.全角:指一个字符占用两个标准字符位置. 汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符.一般的系统命令是不用全角字符的,只是在作文字处理时才会使用全角字符 ...

  8. Java全角半角的转换

    一.中文全角和半角输入的区别 在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角". ...

  9. Windows10系统自带输入法如何切换全角/半角字符

    有些时候因为测试需要,所以需要区分输入的全角字符和半角字符. 全角字符是指一个字符占据俩个标准字符的位置. 半角字符是指一个字符占据一个标准字符的位置. 一个字符是一个字节. 一个字节是8个比特位. ...

最新文章

  1. 小米做手机是真不赚钱,米粉要支持请多容忍广告
  2. 递归时间/空间复杂度的分析(斐波那契为例)
  3. 如何将EDM营销与多渠道推广方式相结合
  4. C++中string::find()函数和string::npos函数的使用
  5. 第一部分 线程APIs(Thread APIs)线程和运行(Threads and Runnables)
  6. 安卓4.2系统_五分钟了解 海贝(HiBy)R6PRO 安卓智能Hi-Fi播放器
  7. 怎样查看sql服务器日志文件,怎么通过sql日志,查看以前执行过的sql语句
  8. html页面调用高德地图,html前端使用高德地图入门教程
  9. ffmpeg将图片和mp3合并成mp4
  10. java中的match函数_js 正则表达式中的match函数
  11. CityEngine--comp() operator
  12. Contest2973 - 2021秋组队训练赛第十二场 问题 M: Cook Pancakes!
  13. 移动终端管理系统的关键技术研究 - 转贴
  14. 如何记录日常收支,将账目导出生成表格保存
  15. 想和程序员小哥哥做朋友
  16. freemarker生成word,表格分页靠谱
  17. 我所知道的之二:出门
  18. Robust Rank Deficient SLAM
  19. 楼天成瑞典之旅感言,
  20. Mac上抓住每一次灵感迸发的App

热门文章

  1. c#的问号(?)和双问号语法糖(??)的用法和在unity中使用需要注意的事项
  2. windows虚拟机中没有摄像头的解决方法+win10开启摄像头方法
  3. Maven知识梳理及使用
  4. Native memory allocation (mmap) failed to map 6215958528 bytes for committing reserved memory
  5. 如何让优酷播放器自动播放
  6. Java面试心得必备技能储备详解,图文详解!
  7. web前端开发文件命名基本规范
  8. python爬虫知乎用户_python爬虫如何获取知乎问答内容?
  9. Fluorescein-PEG2k-Aminooxy在水中的溶解性比较好,FITC-PEG-Aminooxy
  10. 宾馆房间C++一解:宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开,第二个服务员把所有编号是2的倍数的房间相反处理……以后每个服务员都是如此。共100个服务员哪几扇门是打开的