全角和半角字符的区别
“ABC123”和“ABC123”看起来几乎一样,对计算机来说却是不同的字符。本指南说明全角、半角字符的来历,表单和搜索中常见的问题,中文标点在转换时的特殊之处,日文半角片假名如何用两个字符写出“ガ”,以及看起来像却并不成对的字符。
为什么会有两种宽度
在中文、日文和韩文中,每个字占一个方格。早期的东亚字符集除了汉字,还收录了一套占满整个方格的拉丁字母、数字和符号,这就是全角字符;而英文字母和数字原本只占半个方格,这就是半角字符。日本的 JIS X 0201 还收录了只占半格的片假名。
为了让旧数据可以无损转换,Unicode 两套都保留了下来。全角 ASCII 字符(U+FF01–FF5E)和半角片假名(U+FF61–FF9F)位于“Halfwidth and Fullwidth Forms”区块,Unicode 字符数据库记录了每个字符对应哪个普通字符,转换工具就是按这份记录来转换的。
有全角和半角两种形式的字符
| 类型 | 全角 | 半角 |
|---|---|---|
| 字母 | ABC abc | ABC abc |
| 数字 | 0123 | 0123 |
| 标点和符号 | ,!?:;()@# | ,!?:;()@# |
| 空格 | U+3000(全角空格) | U+0020 |
| 货币等符号 | ¥ ¢ £ | ¥ ¢ £ |
| 日文片假名 | カタカナ ガ パ | カタカナ ガ パ |
| 中日文标点 | 。「」、・ | 。「」、・(日文半角形式) |
汉字、平假名和韩文音节只有一种宽度,没有半角形式。
中文标点:哪些能转成英文标点
中文常用的“,!?:;()”正是 ASCII 符号的全角形式,所以转成半角后就是英文的 , ! ? : ; ( )。但“。”“、”“《》”“【】”以及中文引号“ ”‘ ’是中日文专用的标点,Unicode 中并没有对应的英文标点:“。”只对应日文的半角“。”,而不是英文句点“.”。如果系统要求英文标点,这些需要手动替换。
全角、半角会在哪里出问题
- 表单。只接受数字的输入框会拒绝“138”。从网页或文档复制来的手机号、邮编、身份证号如果是全角,转成半角就能通过。
- 搜索和去重。搜索 ABC 不一定能找到 ABC,客户名单里也可能因为宽度不同把同一个名字存了两次。
- 排版。英文里夹着全角字母会显得很松散,中文里夹着半角标点则显得拥挤。
- 程序和数据。编号、网址、邮箱地址和代码中的全角字符往往会导致错误,最好统一成半角。
日文半角片假名与浊音符号
半角片假名没有单独的浊音、半浊音字母。“ガ”写成“カ”加浊音符号“゙”两个字符,“パ”写成“ハ”加半浊音符号“゚”两个字符。正确的转换工具在转成全角时把两个字符合成一个,转成半角时再拆开,所以字数会变化:“ガッコウ”是五个字符,“ガッコウ”是四个。
看起来像却不成对的字符
| 字符 | 是什么 | 有半角对应吗 |
|---|---|---|
| ~(U+FF5E) | 全角波浪号 | 有:~ |
| 〜(U+301C) | 波浪线(日文标点) | 没有 |
| -(U+FF0D) | 全角连字符减号 | 有:- |
| —(U+2014) | 破折号 | 没有 |
| " ' | 全角直引号 | 有:" ' |
| “ ” ‘ ’ | 弯引号 | 没有 |
平假名和片假名
从“ぁ”到“ゖ”的每个平假名都有同名的片假名,在 Unicode 中相隔正好 96 个码位,所以可以准确互转:“やまだ たろう”变成“ヤマダ タロウ”。长音符号“ー”两种假名都用,保持不变。
给程序员:规范化会改得更多
Unicode 规范化形式 NFKC 也会把全角字母转成半角,并把“ガ”合成“ガ”,但同时会改动许多其他字符:“①”变成“1”,“№”变成“No”,“㈱”变成“(株)”。如果你只想改变宽度,就只转换全角、半角成对的字符,其余保持不变。
常见问题
中文里的数字应该用全角还是半角?
两种都有人用,出版社和机关也有各自的规定。同一份文档里保持一致,并遵守表单或出版方的要求即可。
转成半角会改变汉字吗?
不会。汉字、平假名和韩文没有半角形式,保持不变。
全角空格等于两个半角空格吗?
不等于。全角空格(U+3000)是一个占一个汉字宽度的字符,转换后变成一个普通空格。
为什么“。”转半角后变成了“。”?
因为在 Unicode 中“。”只和日文的半角句号“。”成对,这一对归在“片假名”选项里。只转换字母、数字和标点符号时,不勾选“片假名”,“。”就会保持不变。