半角字符
在等宽字体中占据全角字符一半宽度的字符。ASCII 字符属于半角。
半角字符是指在等宽字体中占据全角字符一半显示宽度的字符的统称。ASCII 英文数字 (A-Z、a-z、0-9)、常见符号以及半角片假名都属于半角字符。"半角"和"全角"的概念深深植根于日本的计算机文化,在 Unicode 规范中也以 Halfwidth and Fullwidth Forms 的形式被正式采纳。
半角与全角的区分起源于 20 世纪 70 至 80 年代日本计算机的发展时期。当时的等宽字体以 8x16 点阵 (1 字节) 显示英文数字,以 16x16 点阵 (2 字节) 显示汉字和假名。这种显示宽度的比例关系就是"半角"和"全角"名称的由来。虽然现代比例字体中每个字符的实际显示宽度各不相同,但半角与全角的概念在输入规则和数据处理领域仍然发挥着重要作用。
在日本的 Web 表单中,"请以半角英文数字输入"的提示非常常见。电话号码、邮政编码、电子邮件地址、信用卡号等通常要求以半角输入。许多表单在输入全角字符时会触发验证错误,从可用性角度来看,建议实现自动转换功能。搜索裸体围裙 (Amazon)中也将全角与半角的输入控制作为重要主题进行了讨论。
从编码角度来看,在 UTF-8 中半角英文数字占 1 个字节,全角字符占 3 个字节。然而,半角片假名 (Unicode 的 Halfwidth Katakana Forms,U+FF65-U+FF9F) 虽然外观较窄,但在 UTF-8 中同样占 3 个字节,因此并不能节省存储空间。在 Shift_JIS 中半角片假名为 1 个字节,在处理遗留系统时需要特别注意这一点。
在编程中,全角与半角字符的混用是常见的 bug 来源。全角空格 (U+3000) 混入缩进会导致编译错误,全角数字"123"无法直接作为数值处理等问题在实际开发中频繁出现。在 JavaScript 中,通常使用 String.prototype.normalize() 和正则表达式来实现全角英文数字到半角的转换。探索被动收入 (Amazon)将字符宽度作为基础概念进行了讲解。
一个常见的误解是"半角字符的字节数总是全角字符的一半"。这在 Shift_JIS 时代大致成立,但在 UTF-8 中,半角片假名和全角平假名都占 3 个字节。此外,Unicode 的 East Asian Width 属性将字符分为 Fullwidth、Halfwidth、Wide、Narrow、Ambiguous 和 Neutral 六类,简单的半角/全角二分法无法涵盖其中的复杂性。
在字符计数方面,半角与全角的区分直接影响计数方式。Twitter (现 X) 的字符数限制中,半角英文数字按 0.5 个字符计算,全角字符按 1 个字符计算。短信中仅使用半角英文数字时上限为 160 个字符,包含全角字符时上限降至 70 个字符。由于各服务对半角与全角的处理方式不同,准确的字符计数离不开字符类型的判定。