为何PHP中Unicode数字上标仅1-3有效,4-9输出为问号
问题根因
你遇到的问题核心是编码映射范围不匹配:
utf8_decode()函数的作用是将UTF-8编码的字符串转换为ISO-8859-1(Latin-1)编码,而Latin-1编码表内仅收录了¹(U+00B9)、²(U+00B2)、³(U+00B3)三个上标数字,⁴到⁹对应的Unicode码位为U+2074~U+2079,不在Latin-1的编码范围内,转换时会被默认替换为?,这就是只有前三个上标能正常显示的原因。- 你尝试用
json_decode("\u{2074}")不生效的原因同理,就算拿到了正确的UTF-8字符,只要后续还用了转Latin-1的操作、或者输出场景编码不对,最终输出还是会变成问号。 - 你使用forceutf8库后依然输出问号,和库本身无关,通常是以下两个原因导致:
- 你的PHP源代码文件本身没有以UTF-8无BOM格式保存,源文件中的
⁴字符保存时就已经出现了编码损坏 - 输出场景没有指定UTF-8编码:如果是浏览器访问,没有输出UTF-8的编码声明头,浏览器用了GBK等非UTF-8编码解析内容;如果是命令行运行,终端的默认编码不是UTF-8,无法解析对应字符。
- 你的PHP源代码文件本身没有以UTF-8无BOM格式保存,源文件中的
解决方案
- 首先确认你的PHP源代码文件使用UTF-8无BOM格式保存,大部分编辑器都可以在右下角或者编码设置中查看修改。
- 完全弃用
utf8_decode()处理上标字符,输出前声明UTF-8编码头,直接输出原始字符即可,示例代码:
<?php // 放在代码最开头,执行前不能有任何输出 header('Content-Type: text/html; charset=utf-8'); // 直接输出即可,不需要额外转码 echo '¹²³⁴⁵⁶⁷⁸⁹'; ?>
- 如果是命令行运行脚本,确认你的终端默认编码为UTF-8:Windows系统默认cmd终端编码为GBK,无法正常显示⁴及以上的上标字符,可切换为Windows Terminal、PowerShell 7+等支持UTF-8的终端运行,或者临时修改终端编码为65001。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

