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

如何通过GitHub API在Shell脚本中创建含Emoji的标签?

问题描述

我尝试使用GitHub API创建标签,希望在标签名称中加入Emoji,但遇到了问题。以下是我的Shell脚本:

source config.txt

labels2=(
    "Sleep $zzz_unicode:FFFFFF"
)

# Read repository names from file
while IFS= read -r repo; do
    REPO_USER=$(echo "$repo" | cut -f1 -d /)
    REPO_NAME=$(echo "$repo" | cut -f2 -d /)

    echo "-----------------------------------------[$REPO_USER/$REPO_NAME]---------------------------------"

    # Iterate over labels
    for label in "${labels2[@]}"; do
        label_name=$(echo "$label" | cut -d ":" -f 1)
        label_color=$(echo "$label" | cut -d ":" -f 2)


        data="{\"name\":\"$label_name $emoji\",\"color\":\"$label_color\"}"
        response=$(curl -s -w "%{http_code}" -u "$token:x-oauth-basic" --request POST --data "$data" "https://api.github.com/repos/$REPO_USER/$REPO_NAME/labels")
        response_code=$(echo "$response" | tail -n1)
        response_body=$(echo "$response" | sed '$d')
        if [[ $response_code -eq 201 ]]; then
            echo "Label '$label_name $emoji' created successfully in repository '$REPO_USER/$REPO_NAME'"
        else
            echo "Failed to create label '$label_name $emoji' in repository '$REPO_USER/$REPO_NAME'. Response: $response_body"
        fi
    done

done < repo_names.txt

我尝试了两种方式:直接使用Emoji(如"Bug 🐛:FF0000")和使用Unicode变量(如"Sleep $zzz_unicode:FFFFFF",其中$zzz_unicode对应💤)。手动创建的标签"Bug 🐛"(颜色FF0000)能被脚本正常识别:

Fetching labels for Repo...
[
  {
    "id": someID,
    "node_id": "some_nodeID",
    "url": "https://api.github.com/repos/repo/labels/test%20%F0%9F%90%9B",
    "name": "test 🐛",
    "color": "ff0000",
    "default": false,
    "description": ""
  }
]

但通过脚本创建时,直接用Emoji会生成"Bug ??",用Unicode变量则生成"Sleep"(丢失了Emoji)。请问该如何正确实现?

解决方法
  • 强制脚本使用UTF-8编码
    Shell执行环境的字符编码如果不是UTF-8,会导致Emoji乱码。在脚本开头添加以下代码:

    export LC_ALL=en_US.UTF-8
    export LANG=en_US.UTF-8
    
  • 用jq构造JSON数据
    手动拼接JSON容易出现编码和转义错误,使用jq工具可以自动处理这些问题:

    1. 先安装jq(如apt install jq或brew install jq)
    2. 修改脚本中构造data的部分:
      data=$(jq -n --arg name "$label_name $emoji" --arg color "$label_color" '{name: $name, color: $color}')
      
  • 检查Unicode变量定义
    确保config.txt中的zzz_unicode是直接的Emoji字符,比如zzz_unicode="💤",不要用转义的Unicode码点(如\U0001F444),Shell对这类转义的解析需要额外处理,直接用字符更可靠。

  • curl请求指定UTF-8编码
    在curl命令中添加请求头,明确告知API内容编码:

    response=$(curl -s -w "%{http_code}" -u "$token:x-oauth-basic" -H "Content-Type: application/json; charset=utf-8" --request POST --data "$data" "https://api.github.com/repos/$REPO_USER/$REPO_NAME/labels")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:32:03