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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:06:23