全角半角转换处理的是字符的宽度:同样一个字母或数字,半角只占半个汉字宽,全角却占满一个汉字宽。中文输入法有时会不小心打出全角数字,从 PDF 或某些网页复制的账号、金额也常常带着全角字符,导致校验不通过、排序错乱。把文字粘进来,一键就能把全角转成半角,或者反过来。
要留意的是,它只负责换宽度,不管标点是中文还是英文。这一层区分下面会专门说明,别和站内的中英标点转换用混。
全角和半角,差的是宽度不是字形
全角和半角不是两种字体,而是同一类字符的两种宽度版本。在等宽排版里,一个全角字符占两个半角的位置,一个半角字符占一个。所以全角字母、数字、标点看上去比半角胖一些,之间还带着明显空隙。这种设计来自东亚文字的排版传统:汉字本身是方块、占满一格,为了让字母数字和汉字对齐,就有了占同样宽度的全角版本。日常正文里我们用的其实是半角,全角多在中文输入法、旧文档和某些系统里出现。
码位规律:全角 = 半角 + 0xFEE0
全角和半角之间有一条很整齐的对应规律:大多数全角字母、数字、标点的 Unicode 码位,等于对应半角字符的码位加上 0xFEE0。举例来说,半角大写 A 是 U+0041,全角 A 就是 U+FF21;半角数字 1 是 U+0031,全角 1 就是 U+FF11。这条规律让转换变得非常可靠:只要判断字符落在全角区间,减去偏移量就能得到半角版本,反之加回去即可。它也是很多程序判断和转换全半角的基础。
全角空格是单独的字符:U+3000 和 U+0020
空格是个特例,不遵循上面那条偏移规律。半角空格是 U+0020,而全角空格是一个单独的字符 U+3000,来自中文标点区。两者看起来都什么都没有,宽度却差一倍,在排版对齐、程序解析时会造成明显差别——比如从网页复制的缩进里混进全角空格,粘贴到代码里就会报错,肉眼还很难发现。所以转换工具通常把全角空格单独处理,换成半角空格,避免它藏在文本里捣乱。
这些全角字符是从哪来的
最常见的是中文输入法:在中文状态下按住 Shift 敲数字,或不小心切到了全角模式,打出来的数字和字母就是全角。另一个常见来源是复制:从 PDF、扫描件、部分老网页和 Office 文档里复制的文字,常常保留着全角字符,尤其是数字和括号。还有一种是从中文标点顺手带出来的全角符号。它们单看和半角差别不大,批量处理时却会引发问题,所以粘贴数据前先转一遍,是个省事的好习惯。
全角数字最常见的坑:账号、金额、验证码
全角数字看起来和半角差不多,程序却当成完全不同的字符。后果通常有三种:一是账号、订单号、验证码校验不通过,系统提示格式错误却查不出原因;二是金额、数量参与计算时报错或算错,因为程序不认全角数字;三是排序、去重、查找时对不上,明明看着一样却匹配不到。帮人排查过一次:同事小李从表格里复制银行卡号去转账,连续失败三次,查了半天才发现复制来的卡号里有几个全角数字,转成半角后一次就成功了。处理这类数据前,先把全角转成半角,能省掉很多莫名其妙的报错。
它和中英标点转换的分工,别用错
站内还有一个中英标点转换,两者解决的是不同问题,别搞混。本工具换的是字符的宽度:把全角字母、数字、空格、标点变成半角,或反向转换,改变的是同一个字符的胖瘦版本。中英标点转换换的则是标点的语言归属:把中文标点(,。)换成英文标点(, .),或者反过来,改的是用哪一套标点体系。需要统一标点体系时用中英标点转换,需要修复宽度错位时用本工具;必要时可以先用本工具把宽度理正,再按需处理标点。
延伸阅读:中英标点转换
参考资料
常见问题
全角半角转换和中英标点转换有什么区别?
本工具换的是字符宽度,把全角字母、数字、空格、标点变成半角或反向;中英标点转换换的是标点体系,把中文标点换成英文标点或反过来。两者针对的问题不同,需要时可先用本工具理正宽度。
为什么全角数字会让程序报错?
因为全角数字和半角数字在计算机里是两个不同的字符,程序校验账号、金额时只认半角数字,遇到全角就会判定格式错误。先把全角转成半角即可解决。