如何通过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工具可以自动处理这些问题:- 先安装
jq(如apt install jq或brew install jq) - 修改脚本中构造
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
相关产品推荐
相关产品推荐

