macOS系统bash/sh环境使用curl获取SharePoint JSON时Unicode字符转义异常问题
问题原因
- SharePoint返回的JSON本身就将非ASCII字符转义为
\uXXXX格式,这是JSON规范允许的合法表示方式,和curl本身无关。 - macOS系统默认自带的bash版本为3.2.x(受GPL协议限制苹果没有更新更高版本),同时POSIX标准的
sh的echo内置命令默认不解析\u类的反斜杠转义序列,直接原样输出就会看到\u00f6这类内容。 - zsh的
echo内置命令默认开启了转义序列解析,会自动把\u00f6转换为对应的Unicode字符ö,所以zsh下显示正常。 - 你原脚本中
echo $files没有给变量加双引号,还会导致空格、换行等特殊字符被shell拆分,也可能引发显示异常。
解决方法
方法1:使用printf(兼容所有POSIX shell,推荐)
printf是POSIX标准定义的命令,行为在不同shell下完全一致,用%b参数即可解析字符串中的反斜杠转义,修改脚本如下:
#!/bin/sh url="https://company.sharepoint.com/sites/Testfiles" folder="TestDocuments" files=$(curl -s "$url/_api/web/GetFolderByServerRelativeUrl('Documents/$folder')/Files" -H "Accept: application/json") printf '%b\n' "$files"
注意所有变量引用都加上双引号,避免字符拆分问题。
方法2:给bash的echo加-e参数
如果确认运行环境是bash,可以给echo加上-e参数开启转义解析:
echo -e "$files"
注意-e不是POSIX标准参数,在纯sh环境下可能不生效。
方法3:使用jq处理JSON(专业处理JSON场景推荐)
如果需要长期处理JSON数据,推荐使用专用JSON处理工具jq,它会自动解析\u转义为实际Unicode字符,同时支持格式化、过滤JSON字段等功能:
- 先安装jq:
brew install jq(macOS下使用Homebrew安装) - 修改脚本直接管道输出到jq即可:
#!/bin/sh url="https://company.sharepoint.com/sites/Testfiles" folder="TestDocuments" curl -s "$url/_api/web/GetFolderByServerRelativeUrl('Documents/$folder')/Files" -H "Accept: application/json" | jq .
如果需要提取文件名等字段,还可以直接用jq过滤,比如jq '.value[].Name'就能直接输出所有正常显示的文件名。
内容的提问来源于stack exchange,提问作者SuperDOS
相关产品推荐
相关产品推荐

