全角半角转换工具

全角与半角在 Unicode 里是两个不同的码位区间:U+FF01 到 U+FF5E 与 U+0021 到 U+007E 的差恒为 0xFEE0,只有全角空格 U+3000 是例外,它与半角空格差 0x2FE0。本工具双向互转,并告诉你有多少个字符被转换、有多少个原样保留。

方向:全角 → 半角。ASCII 区靠 0xFEE0 偏移,全角空格 U+3000 单独走 0x2FE0。
ABC123!?() Hello World! 2026-10-11 アイウ123¥ -- 统计 -- 共 43 个字符(含 3 个换行):转换 27 个,原样保留 16 个 原样保留清单:e l l o W o r l d ア イ ウ ¥ -- 单行 -- ABC123!?()  → ABC123!?() (11 个字符,转换 11 个)

默认示例:全角 ABC123!?()  转成半角 ABC123!?() 。单行框、方向、多行框任意一项改动即重新转换,单行框里按回车同样触发一次。

使用方法

  1. 「单行文本」默认填全角的 ABC123!?() ,光标停在这个框里直接按回车就转换一次,改动内容也会立刻重算,不必点按钮。
  2. 「转换方向」有两项:全角转半角用于清洗从 Excel、PDF 复制出来的文本;半角转全角用于排版或对齐显示宽度。点「反向」直接对调。
  3. 「明细字符上限」默认 200,范围 1 到 200。它只影响统计与说明的展示范围,不改转换结果;贴进超长文本时可以调小。
  4. 「多行文本」默认写好四行示例,每行独立转换,按 Ctrl+Enter(Mac 上是 Cmd+Enter)一次算完;万一被清空,点转换时会自动填回这四行。
  5. 结果区第一行是「原文 → 结果」,下面跟着统计:一共多少字符、转换了多少个、原样保留了多少个,以及保留清单。
  6. 结果下面是一张 12 行的常用字符对照,列出码位、全角字符、半角字符与两者差值,默认显示 6 行,点「加载更多」展开全部,点「导出 CSV」存成带字节序标记的表格。
  7. 「复制结果」复制整段转换后的文本;「下载 .txt」存成纯文本文件;「复制对照表」复制正文那张 12 行对照表;「重置」恢复默认文本与方向。
  8. 两个框都为空时提示「请输入要转换的文本」;转换后与原文完全相同时只会提示没有可转换的字符,不会静默返回原文冒充结果。

这个全角半角转换工具能解决什么问题

第一类麻烦是表单校验过不去。全角数字 123 在 input[type=number] 里不合法,parseFloat 也解析不出数字,用户填了 2026 提交后得到空值或 NaN。把这一串转成半角再提交,问题消失,而用户看到的是同一个数字。

第二类麻烦是数据库里出现两条记录。全角与半角是不同码位,做唯一键或精确匹配时 ABC 与 ABC 会被当成两回事,同一家公司、同一个型号因此在库里躺着两行。导入前统一转半角可以从根上避免。

第三类麻烦是搜索漏匹配。用户输入半角、库里存的是从 PDF 复制来的全角,直接相等比较必然漏掉。清洗入库或查询前做归一化,是检索系统里最常被忽略的一步。

第四类麻烦是长度与宽度对不上。全角字符在 UTF-8 里占 3 字节而半角只占 1 字节,按字节截断的接口会切出半个汉字;显示上全角占两个西文字符宽,做等宽排版时也要先统一。

本站在这一页也把它写作「全角半角转换」,指的是码位层面的互转,不是调整字体的显示宽度。

计算原理与变量说明

全角与半角不是字形的宽窄,而是 Unicode 里两个不同的码位区间。全角 ASCII 变体占 U+FF01 到 U+FF5E,半角 ASCII 占 U+0021 到 U+007E,两区一一对应,差值恒为 0xFEE0,也就是十进制的 65248。这条规则覆盖了 94 个字符,从 ! 到 ~。

转换就是一次加法或一次减法。全角转半角时,若码位落在 U+FF01 到 U+FF5E,减 0xFEE0;半角转全角时,若码位落在 U+0021 到 U+007E,加 0xFEE0。其余码位一律不动。

唯一的例外是空格。全角空格是 U+3000,不在 U+FF01 到 U+FF5E 区间里,它与半角空格 U+0020 的差是 0x2FE0,也就是十进制的 12256。如果只用 0xFEE0 一条规则,全角空格会被漏掉或者被算成别的字符,所以本页把它单列一条分支。

U+FF00–FFEF 是兼容区而不是独立字符集。Unicode 把这块命名为 Halfwidth and Fullwidth Forms,里面的字符都有对应的规范字符,全角 A 的规范等价物就是半角 A。这块的存在是为了 round-trip 老编码(Shift-JIS、Big5 里的全角字符),不是为了表达新语义。

半角片假名不在转换范围内。ア 是 U+FF71、ヲ 是 U+FF66、ー 是 U+FF70,它们属于 U+FF66 到 U+FF9D 这一段,与全角片假名 U+30A1–U+30F6 之间不是简单偏移,无法通过加减一个常数互转,需要单独映射表。本页一律原样保留。

全角货币符号同样不处理。¢ 是 U+FFE0、£ 是 U+FFE1、¥ 是 U+FFE5,属于 U+FFE0 到 U+FFE6 这一段。它们没有对应的半角 ASCII 字符,本页保留原样,不做近似替换。

为什么不做 NFKC。NFKC 会一次性把所有兼容字符折叠成规范形式,除了全角字母,还会把 ㈱ 变成 (株)、把 ① 变成 1、把 fi 变成 fi。清洗表单数据时这些副作用往往超出预期,所以本页只做区间加减,把改动范围限制在你看得见的那一块。

往返一致性是可验证的。全角转半角再转回全角,结果应当与原文逐字相同。默认示例 ABC123!?()  转过去是 ABC123!?() ,再转回来仍是 ABC123!?() ,包括末尾那个全角空格。

完整示例

默认单行示例是 ABC123!?() ,共 11 个字符,全部落在可转换区间(含末尾的全角空格),转成半角后是 ABC123!?() ,末尾是一个半角空格。

多行示例第一行与单行相同。第二行 Hello World! 是混合串:H 是全角要转,ello 与 World 本来就是半角、原样保留,中间那个空格是全角 U+3000 要走另一条分支,末尾的 ! 是全角要转,结果是 Hello World!。

第三行 2026-10-11 是日期,全角数字与全角连字符都在 U+FF01 到 U+FF5E 内,转成 2026-10-11,可以直接塞进日期输入框。

第四行 アイウ123¥ 演示保留逻辑:前三个半角片假名属于 U+FF66 到 U+FF9D,不转换;123 转成 123;¥ 是 U+FFE5,不转换。结果是 アイウ123¥。

切到半角转全角方向,输入 ABC123!?() 得到 ABC123!?() ,注意末尾的半角空格会变成全角空格 U+3000,这是唯一走了不同偏移量的字符。

统计口径:每转换一个字符计 1,未改变的码位计入「原样保留」,换行也计入保留数。默认四行共 43 个字符(含 3 个换行),转换 27 个,保留 16 个。

全角半角字符对照表

下表列出 12 个最常用的全角字符与它们的半角对应物,最后一列是两者的码位差,全部为 0xFEE0。

全角码位全角半角码位半角差值
U+FF01!U+21!0xFEE0
U+FF02"U+22"0xFEE0
U+FF03#U+23#0xFEE0
U+FF04$U+24$0xFEE0
U+FF05%U+25%0xFEE0
U+FF06&U+26&0xFEE0
U+FF08(U+28(0xFEE0
U+FF09)U+29)0xFEE0
U+FF0A*U+2A*0xFEE0
U+FF0B+U+2B+0xFEE0
U+FF0C,U+2C,0xFEE0
U+FF0D-U+2D-0xFEE0

第二张表列出本工具不处理的字符:转了反而错,所以一律原样保留。

字符码位本工具行为原因
アU+FF71原样保留半角片假名,与全角片假名不是简单偏移,需单独映射表
ヲU+FF66原样保留半角片假名,同上
ーU+FF70原样保留半角长音记号,同上
¢U+FFE0原样保留全角分,没有对应的半角 ASCII 字符
£U+FFE1原样保留全角磅,同上
¥U+FFE5原样保留全角人民币符号,同上
*U+FF0A可转换在 U+FF01 到 U+FF5E 区间内,减 0xFEE0 得 U+2A
 U+3000可转换全角空格,靠的是 0x2FE0 而不是 0xFEE0

第三张表说明「为什么要转」:每一条都对应一个真实会出问题的环节。

序场景不转的后果
1表单校验全角数字在 input[type=number] 里不合法,parseFloat 解析不出数字
2数据库唯一键全角与半角是不同码位,同一内容被当成两条记录
3搜索匹配用户输入半角、库里存全角,直接相等比较会漏
4长度限制全角在 UTF-8 里占 3 字节,按字节截断的接口会切坏字符
5批量导入从 Excel、PDF 复制的文本常带全角,导入前要清洗
6NFKC 的副作用归一化会连带改变其他兼容字符,例如 ㈱ 变成 (株)
7本工具的边界只处理 Halfwidth and Fullwidth Forms 块里的 ASCII 区,其余不动
8半角片假名要转全角需要单独映射表,U+FF66–FF9D 到 U+30A1–30F6 不是简单偏移

读第一张表看规律:除空格外所有字符的差值都是 0xFEE0,码位低位数字完全对应。读第二张表看边界:本工具宁可保留也不做近似替换,因为它无法确定你的目标字符集。

结果边界、舍入与适用说明

常见问题

为什么全角空格要单独处理?

因为它是 U+3000,不在 U+FF01 到 U+FF5E 这个区间里。它与半角空格 U+0020 的差是 0x2FE0(12256),不是 0xFEE0(65248)。只用一条减法规则处理,全角空格会被漏掉或被算错,所以本页为它单列一个分支。

半角片假名为什么不转?

因为 U+FF66 到 U+FF9D 与全角片假名 U+30A1 到 U+30F6 之间不是恒定偏移,无法靠加减一个常数互转,必须查一张专门的映射表。本页的处理策略是原样保留而不是猜。

直接用 NFKC 归一化不就行了?

NFKC 确实能处理大部分全角字符,但它会一并折叠所有兼容字符:㈱ 变成 (株)、① 变成 1、fi 变成 fi。清洗表单数据时这些副作用常常超出预期,所以本页只做区间加减,改动范围可控。

为什么全角数字在输入框里提交不了?

input[type=number] 只接受 ASCII 数字 U+0030 到 U+0039,全角 123 是 U+FF11 到 U+FF13,浏览器判定为非法值直接置空;parseFloat 遇到全角数字也返回 NaN。转成半角再提交即可。

转换后长度变了吗?

字符个数不变,字节数会变:全角字符在 UTF-8 里占 3 字节,半角只占 1 字节。所以按字符计数不变,按字节截断的接口行为会变,这是导入时最容易忽略的一点。

往返转换能完全还原吗?

能。默认示例 ABC123!?()  转半角得 ABC123!?() ,再转回全角仍是 ABC123!?() ,包括末尾的全角空格。半角片假名与全角货币符号因为不参与转换,往返后也保持原样。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。转换在当前浏览器本地完成,不会上传输入内容。

相关工具