使用 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、bash
和 zsh
使用相同的语法 (\u....
) 以纯文本表示任意 Unicode 代码点ASCII。对于一般的 POSIX-compliant shells,这 not 正确,所以我认为你不能 expect这在 运行 sh
时有效,无论实际使用哪个 shell。 (实际上,它不适用于 bash
3.2,但适用于更高版本的 bash
。)
zsh
对 echo
的实现符合 XSI,默认情况下它会扩展各种字符序列。 (\u
本身未由 XSI 定义,但 zsh
将它们包含在由 echo
扩展的序列列表中。)(POSIX 符合 echo
相当松散,仅说明包含反斜杠的参数可以以特定于实现的方式处理。)
默认情况下,bash
对 echo
的实现 不 XSI 兼容。 -e
启用反斜杠序列的扩展,就像设置 xpg_echo
shell 选项一样。
$ shopt -s xpg_echo
$ echo "$x"
"övning.dotx"
要在 bash 和 zsh 上使用相同的命令:
printf "%b\n" "\u00f6vning.dotx"
我有在 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、bash
和 zsh
使用相同的语法 (\u....
) 以纯文本表示任意 Unicode 代码点ASCII。对于一般的 POSIX-compliant shells,这 not 正确,所以我认为你不能 expect这在 运行 sh
时有效,无论实际使用哪个 shell。 (实际上,它不适用于 bash
3.2,但适用于更高版本的 bash
。)
zsh
对 echo
的实现符合 XSI,默认情况下它会扩展各种字符序列。 (\u
本身未由 XSI 定义,但 zsh
将它们包含在由 echo
扩展的序列列表中。)(POSIX 符合 echo
相当松散,仅说明包含反斜杠的参数可以以特定于实现的方式处理。)
bash
对 echo
的实现 不 XSI 兼容。 -e
启用反斜杠序列的扩展,就像设置 xpg_echo
shell 选项一样。
$ shopt -s xpg_echo
$ echo "$x"
"övning.dotx"
要在 bash 和 zsh 上使用相同的命令:
printf "%b\n" "\u00f6vning.dotx"