gpt4 book ai didi

python - 将 格式的 unicode 字符转换为其 ASCII 等效字符的脚本

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:28 26 4
gpt4 key购买 nike

我正在对 Linux 语言环境文件进行一些更改 /usr/share/i18n/locales (如 pt_BR),更改日期、时间、数字等的默认格式。但由于 unicode 字符在 <U9999> 中显示为字符串格式,文本很难阅读。

这是其中的一个片段:

LC_TIME
abday "<U0044><U006F><U006D>";"<U0053><U0065><U0067>";/
"<U0054><U0065><U0072>";"<U0051><U0075><U0061>";/
"<U0051><U0075><U0069>";"<U0053><U0065><U0078>";/
"<U0053><U00E1><U0062>"

那么,如何制作一个简单的脚本(可能是 bash、python、pearl 等等)来转换此文本以替换 <Uxxxx>代码到他们的 ASCII 等价物? (是的,它们都是低于 255 的 ASCI 字符,大多数甚至低于 127)

如果收到多个答案,我会接受最优雅和/或更详细的解释(如命令中使用的选项和标志)

例如,上面的文本将被转换为:

LC_TIME
abday "Dom";"Seg";/
"Ter";"Qua";/
"Qui";"Sex";/
"Sáb"

另一个可以做相反事情的脚本的奖励点:将给定字符串的所有字符转换为 <Uxxx>格式。

谢谢!

最佳答案

使用字段

#!/bin/bash

awk -F'<U0+|>' '{
for(i=1;i<=NF;i++)
if($i ~ "^[0-9A-F]+$")
$i=sprintf("%c", strtonum("0x"$i))
}1' OFS="" /path/to/infile

说明

  1. -F'<U0+|>' :这就是使这个脚本如此短小的魔力。我们告诉 awk 字段分隔符是 <U0+或者一个简单的 > .这样做的好处是 awk 会为我们自动去除这些字符,因此我们不必使用 gsub() 手动去除这些字符。需要进行 strtonum() 转换时。

  2. for(i=1;i<=NF;i++) : 遍历每个字段

  3. if($i ~ "^[0-9A-F]+$") : 检查当前字段是否仅由十六进制数字组成。请记住,由于上面的#1 类似 <U006F>将被视为 6F此时
  4. $i=sprintf("%c", strtonum("0x"$i)) : 将十六进制数字替换为其对应的 ascii 值。我们必须在字段前加上 $i"0x"所以 awk 知道它是一个十六进制值
  5. }1 : 必填 print 的快捷方式或者总是打印每一行
  6. OFS="" :将输出字段分隔符设置为空字符串。如果我们不这样做,我们将在输出中出现 <U0+ 的任何地方得到空格。或 >

使用 match() [需要 gawk]

#!/bin/bash

gawk '{
while(match($0, /<U[0-9A-F]+>/)){
pat = substr($0,RSTART,RLENGTH)
gsub(/U0+|[<>]/,"",pat)
asc = sprintf("%c", strtonum("0x"pat))
$0 = substr($0, 1, RSTART-1) asc substr($0, RSTART+RLENGTH)
}
}1' /path/to/infile

关于python - 将 <U9999> 格式的 unicode 字符转换为其 ASCII 等效字符的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com