如何用gawk实现字符串与Unicode码点互转及UTF-8字节输出?
Gawk处理Unicode码点与UTF-8字节的操作方法
一、将UTF-8字符转换为十进制Unicode码点序列
gawk完全支持这个需求,只需利用其ord()函数结合字符拆分功能实现。假设目标行存于test.txt文件中,执行以下命令即可输出对应的十进制码点序列:
gawk -v FPAT='.' '{for(i=1;i<=NF;i++) printf "%d%s", ord($i), (i<NF?", ":"\n")}' test.txt
说明
FPAT='.':让gawk按Unicode字符拆分每行内容(而非按字节拆分),确保每个数组元素对应一个完整的Unicode字符。ord($i):获取第i个Unicode字符的十进制码点值。- 循环遍历所有字符,按
码点, 码点的格式输出,最后一行末尾换行。
执行后会输出:119909, 8776, 119898, 43, 119899
二、将十进制码点序列转换为对应UTF-8字符
给定十进制码点序列字符串,可通过gawk的chr()函数将每个码点转换为对应字符,命令如下:
echo "119909, 8776, 119898, 43, 119899" | gawk '{split($0, arr, /, /); for(i in arr) printf "%s", chr(arr[i])}'
说明
split($0, arr, /, /):按,分隔符拆分输入字符串,将每个码点存入数组arr。chr(arr[i]):将十进制码点转换为对应的UTF-8字符。- 循环拼接所有字符并输出,最终得到:
𝑥≈𝑚+𝑛
三、将字符串转换为UTF-8字节数值序列
gawk可以实现这个需求,只需切换到字节处理模式遍历每个UTF-8字节,输出其十进制(或十六进制)值。以字符串á à为例:
输出十进制字节序列
echo "á à" | LC_CTYPE=C gawk '{for(i=1;i<=length($0);i++) {b=substr($0,i,1); printf "%d ", ord(b)}}' | sed 's/ $/\n/'
执行后输出:195 161 32 195 160
输出十六进制字节序列
echo "á à" | LC_CTYPE=C gawk '{for(i=1;i<=length($0);i++) {b=substr($0,i,1); printf "0x%02x ", ord(b)}}' | sed 's/ $/\n/'
执行后输出:0xc3 0xa1 0x20 0xc3 0xa0
说明
LC_CTYPE=C:强制gawk按字节处理字符串,此时length($0)返回字符串的字节数,substr($0,i,1)取第i个字节。ord(b):获取单个字节的十进制值,配合printf可格式化为十六进制。sed 's/ $/\n/':移除末尾多余的空格并换行,让输出更整洁。
内容的提问来源于stack exchange,提问作者lyrically wicked
相关产品推荐
相关产品推荐

