Bash中如何将Unicode码位数组转换为字符串并存入变量
纯Bash实现Unicode码位数组转目标字符串
场景说明
现有存储Unicode码位的数组,需要将每个码位转换为对应字符,拼接后存入字符串变量。下方是对应文本Hello World!的示例码位数组,实际使用时支持最高16位的任意Unicode码值:
array=( 72 101 108 108 111 32 87 111 114 108 100 33 )
常见无效写法问题
之前尝试的拼接\U前缀加十进制码值、再通过printf %b解析的方案无法生效,核心原因是Bash的\UUnicode转义要求后跟8位十六进制数值,直接拼接十进制数不符合转义格式规则。
另外Bash内置的$'\Uxxx'、echo -e '\Uxxxxx'语法仅支持输出固定Unicode字符,无法直接适配动态变量场景:单引号会阻断变量展开,$'\U$i'、"$'\U$i'"这类写法都不会解析变量中存储的码值,无法得到预期结果。
纯Bash实现方案
直接使用Bash内置的printf能力即可完成转换,无需依赖任何外部命令,代码如下:
# 待转换的Unicode码位数组 array=( 72 101 108 108 111 32 87 111 114 108 100 33 ) # 转换结果直接存入result变量 printf -v result '\U%08x' "${array[@]}"
执行完成后,result变量中存储的就是拼接完成的目标字符串,运行echo "$result"即可输出Hello World!。
实现逻辑说明
printf -v <变量名>是Bash内置语法,会直接将格式化输出的结果存入指定变量,相比命令替换的写法执行效率更高- 格式串
\U%08x会自动将每个传入的十进制码位转换为8位前导补零的十六进制值,完全匹配Bash对Unicode转义的参数要求,可覆盖所有16位Unicode码位场景 - 该实现全程使用Bash内置命令,无外部工具依赖,兼容Bash 4.0及以上版本。
内容的提问来源于stack exchange,提问作者Lor
相关产品推荐
相关产品推荐

