使用 unicode 字符卷曲 macos 问题

curl on macos problem with unicode characters

我有在 MacOS 上运行的脚本 它使用 curl 在共享点站点上获取包含文件的 json。

一切正常,但当 bash 中的 运行 或 sh 具有以 \uxxxx 格式写出的 unicode 字符时,curl 的响应。

for example ö is \u00f6
"Name":"\u00f6vning.dotx"

但是当 运行 zsh 编码正确时。

知道为什么吗?您可以使用 bash 或 sh 让它工作吗?

#!/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")
echo $files

当 运行 curl -v

GET /sites/Testfiles/_api/web/GetFolderByServerRelativeUrl('Documents/TestDocuments')/Files HTTP/1.1
> Host: company.sharepoint.com
> User-Agent: curl/7.64.1
> Accept: application/json
> 
< HTTP/1.1 200 OK
< Cache-Control: private, max-age=0
< Transfer-Encoding: chunked
< Content-Type: application/json;odata=minimalmetadata;streaming=true;charset=utf-8

这是完整的 json 回复

{
    "odata.metadata": "https://company.sharepoint.com/sites/Testfiles/_api/$metadata#SP.ApiData.Files12",
    "value": [
        {
            "odata.type": "SP.File",
            "odata.id": "https://company.sharepoint.com/sites/Testfiles/_api/Web/GetFileByServerRelativePath(decodedurl='/sites/Testfiles/Documents/TestDocs/\u00f6vning.dotx')",
            "odata.editLink": "Web/GetFileByServerRelativePath(decodedurl='/sites/Testfiles/Documents/TestDocs/%C3%B6vning.dotx')",
            "CheckInComment": "",
            "CheckOutType": 2,
            "ContentTag": "{39C1CD78-3674-49F4-9982-214B33FC03BE},2,5",
            "CustomizedPageStatus": 0,
            "ETag": "\"{39C1CD78-3674-49F4-9982-214B33FC03BE},2\"",
            "Exists": true,
            "IrmEnabled": false,
            "Length": "48725",
            "Level": 1,
            "LinkingUri": "https://company.sharepoint.com/sites/Testfiles/Documents/TestDocs/\u00f6vning.dotx?d=w11c1cd78361119f49982214b33fd43be",
            "LinkingUrl": "https://company.sharepoint.com/sites/Testfiles/Documents/TestDocs/\u00f6vning.dotx?d=w11c1cd78361119f49982214b33fd43be",
            "MajorVersion": 1,
            "MinorVersion": 0,
            "Name": "\u00f6vning.dotx",
            "ServerRelativeUrl": "/sites/Testfiles/Documents/TestDocs/\u00f6vning.dotx",
            "TimeCreated": "2021-10-14T13:32:16Z",
            "TimeLastModified": "2021-10-14T13:32:16Z",
            "Title": "",
            "UIVersion": 512,
            "UIVersionLabel": "1.0",
            "UniqueId": "39c1cd78-3674-49f4-9982-214b33fc03be"
        }
    ]
}

bash 中,您需要使用 -e 选项让 echo\u 转义符扩展为您的终端可以显示的 UTF-8 序列。

$ x='"\u00f6vning.dotx"'
$ echo "$x"
"\u00f6vning.dotx"
$ echo -e "$x"
"övning.dotx"

首先,我们有一个“巧合”,即 JSON、bashzsh 使用相同的语法 (\u....) 以纯文本表示任意 Unicode 代码点ASCII。对于一般的 POSIX-compliant shells,这 not 正确,所以我认为你不能 expect这在 运行 sh 时有效,无论实际使用哪个 shell。 (实际上,它不适用于 bash 3.2,但适用于更高版本的 bash。)

zshecho 的实现符合 XSI,默认情况下它会扩展各种字符序列。 (\u 本身未由 XSI 定义,但 zsh 将它们包含在由 echo 扩展的序列列表中。)(POSIX 符合 echo 相当松散,仅说明包含反斜杠的参数可以以特定于实现的方式处理。)

默认情况下,

bashecho 的实现 XSI 兼容。 -e 启用反斜杠序列的扩展,就像设置 xpg_echo shell 选项一样。

$ shopt -s xpg_echo
$ echo "$x"
"övning.dotx"

要在 bash 和 zsh 上使用相同的命令:

printf "%b\n" "\u00f6vning.dotx"