You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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库后依然输出问号,和库本身无关,通常是以下两个原因导致:
    1. 你的PHP源代码文件本身没有以UTF-8无BOM格式保存,源文件中的⁴字符保存时就已经出现了编码损坏
    2. 输出场景没有指定UTF-8编码:如果是浏览器访问,没有输出UTF-8的编码声明头,浏览器用了GBK等非UTF-8编码解析内容;如果是命令行运行,终端的默认编码不是UTF-8,无法解析对应字符。
解决方案
  1. 首先确认你的PHP源代码文件使用UTF-8无BOM格式保存,大部分编辑器都可以在右下角或者编码设置中查看修改。
  2. 完全弃用utf8_decode()处理上标字符,输出前声明UTF-8编码头,直接输出原始字符即可,示例代码:
<?php
// 放在代码最开头,执行前不能有任何输出
header('Content-Type: text/html; charset=utf-8');

// 直接输出即可,不需要额外转码
echo '¹²³⁴⁵⁶⁷⁸⁹';
?>
  1. 如果是命令行运行脚本,确认你的终端默认编码为UTF-8:Windows系统默认cmd终端编码为GBK,无法正常显示⁴及以上的上标字符,可切换为Windows Terminal、PowerShell 7+等支持UTF-8的终端运行,或者临时修改终端编码为65001。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:12:03