最后更新:

全角与半角的区别 - 对字符计数的影响详解

7 分钟阅读

全角半角转换工具

粘贴文本,即可将英文字母、数字、片假名、标点符号和空格在全角与半角之间即时互转。转换完全在浏览器中完成,输入内容不会发送到服务器。

转换方向
转换对象

平假名、汉字和 emoji 不会被转换。波浪号 〜 (U+301C) 也保持原样,只有全角波浪线 ~ (U+FF5E) 会被转换。

转换工具的使用方法

只需三步:(1) 将文本粘贴到输入框,(2) 选择转换方向 (全角 → 半角,或反向),(3) 用复选框指定转换对象 (英文字母和数字、片假名、标点符号、空格)。结果随输入实时更新,无需点击转换按钮。点击"复制结果"即可将转换后的文本用于表单填写或 CSV 数据整理。将结果粘贴到字符计数器,还可以分别查看全角和半角字符的数量。

哪些字符会被转换,哪些不会

本工具不使用 NFKC 之类的一揽子标准化,而是仅依据明确的对照表,转换全角字符半角字符之间存在一一对应关系的字符。

另一方面,平假名、汉字、emoji (包括 ZWJ 组合序列) 和组合字符在任何方向都不会被改动。下文"灰色地带字符"中介绍的波浪号 〜 (U+301C) 与全角波浪线 ~ (U+FF5E) 是不同的字符,因此被有意排除在转换范围之外。没有半角形式的片假名 (ヰ、ヱ、ヵ、ヶ 等) 也会保持原样。

什么是全角和半角

全角 (Full-width) 和半角 (Half-width) 的概念源于等宽字体时代。全角字符占据一个完整的字符宽度,半角字符占据一半的宽度。

类别全角示例半角示例说明
英文字母A B CA B C全角英文字母在日常使用中较少见
数字1 2 31 2 3全角数字在正式文档中偶尔使用
片假名ア イ ウア イ ウ半角片假名在旧系统中常见
标点符号。 、 !. , !中日文通常使用全角标点
空格 (U+3000) (U+0020)全角空格宽度是半角的两倍

中文汉字、日文平假名和片假名天然就是全角字符,没有对应的半角形式 (半角片假名除外)。而英文字母和数字既有全角形式也有半角形式。

全角半角对字符计数的影响

不同平台和系统对全角半角的计数方式不同,这是造成字数统计混乱的主要原因。

平台/系统计数方式"A" 的计数"A" 的计数
Unicode 字符数每个码点 = 111
UTF-8 字节数按字节计算3 字节1 字节
Shift_JIS 字节数按字节计算2 字节1 字节
X (Twitter)加权字符11
某些日本系统全角=2,半角=121

特别需要注意的是,某些日本的传统系统 (银行、政府机构等) 仍然使用"全角 = 2 字节、半角 = 1 字节"的计数方式。在这些系统中,"ABC" (半角) 计为 3,而"ABC" (全角) 计为 6。

UTF-8 编码下的字节数差异

在现代 Web 开发中最常用的 UTF-8 编码下,全角和半角字符的字节消耗差异显著。了解字符数与字节数的区别对于数据库设计和 API 开发至关重要。

字符类型UTF-8 字节数示例
半角英数字1 字节A, 1, @
全角英数字3 字节A, 1
中文汉字3 字节中,文
日文平假名3 字节あ, い
半角片假名3 字节ア, イ
全角标点3 字节。、!
半角标点1 字节. , !

常见问题与解决方法

全角半角的使用规范

在中文写作中,全角半角的使用有一些通用规范:

编程中的全角半角转换

在编程中经常需要进行全角半角转换。Unicode 中全角 ASCII 字符 (U+FF01~U+FF5E) 与半角 ASCII 字符 (U+0021~U+007E) 之间有固定的偏移量 (0xFEE0),可以通过简单的数学运算进行转换。

不过,片假名的转换要复杂得多:半角片假名将浊音符号 (゙) 和半浊音符号 (゚) 定义为独立字符,"ガ"在半角形式下是"ガ"两个字符,因此需要额外的合成与分解处理。另外,JavaScript 的 normalize("NFKC") 虽然可以一次性完成宽度标准化,但它也会把"㍻"展开为"平成"等,产生超出预期的变换,实际使用时需要谨慎限定适用范围。本文开头的转换工具正是为了避免这类副作用,只使用明确的对照表进行转换。

灰色地带字符

有些字符无法简单归类为全角或半角,它们在 Unicode East Asian Width 属性中被归为 A (Ambiguous,不确定宽度),在不同的终端和编辑器中可能显示为单倍宽度,也可能显示为双倍宽度。

典型例子是波浪号 〜 (U+301C) 与全角波浪线 ~ (U+FF5E)。两者外观几乎相同,但在 Unicode 中是不同的字符。Windows 的 Shift_JIS 实现曾把波浪号 (U+301C) 映射到全角波浪线 (U+FF5E),导致跨操作系统交换文本时出现乱码,这一问题被称为"波浪号问题"。类似地,日元符号 ¥ (U+00A5) 与反斜杠 \ (U+005C) 在日语环境的某些字体中显示为同一形状,源于 JIS X 0201 把日元符号分配到了 ASCII 反斜杠的位置 (0x5C)。

本文开头的转换工具遵循这一历史教训:波浪号 (U+301C) 不做转换,只转换全角波浪线 ~ (U+FF5E) ⇔ ~ (U+007E);日元符号按 ¥ (U+FFE5) ⇔ ¥ (U+00A5)、反斜杠按 \ (U+FF3C) ⇔ \ (U+005C) 分别处理,绝不混淆外观相似的字符。

总结

全角和半角的区别看似简单,但在字符计数、数据库存储、文本搜索等方面都会产生实际影响。理解不同系统的计数方式差异,统一使用规范,是避免相关问题的关键。使用字符计数器可以分别显示全角和半角字符的数量,帮助您准确掌握文本的字符构成。

分享这篇文章