提问人:Enlico 提问时间:1/9/2023 更新时间:1/16/2023 访问量:73
为什么 sed 的点与 latin1 编码中的 ù 不匹配?
Why sed's dot doesn't match ù in latin1 encoding?
问:
我有两个包含文本的文件,但一个是用 UTF-8 编码的,另一个是用 latin1 编码的,所以它们的内容是这样的aùb
critic_utf8
critic_latin1
$ od -a critic_utf8
0000000 a C 9 b nl
0000005
$ od -a critic_latin1
0000000 a y b nl
0000004
现在,撇开我不知道第二个输出中的那个(对应于 )是什么(我想了解,所以一个子问题是:那是什么?),在我看来,Sed 不匹配它:y
ù
y
.
$ sed 's/.*/x/' critic_latin1
xùb
$ sed 's/.*/x/' critic_utf8
x
$ sed 's/./x/g' critic_latin1
xùx
$ sed 's/./x/g' critic_utf8
xxx
这是什么意思?那个 Sed 不能处理 latin1 编码的文本文件?尽管如此,我认为除了换行符之外的所有内容都会匹配,但在这里它也不匹配其他内容。我知道这并没有像以前那样做出反应,正如以下证明的那样:.
ù
.
\n
$ sed -z 's/.*/x/' critic_latin1
xùb
我在尝试尝试我在这个答案中发现的内容时,在玩弄和文件(那些带有单词和同义词的文件)时注意到了这一点。*.idx
*.dat
答:
1赞
Arnaud Valmary
1/9/2023
#1
两个步骤:
sed
命令读取包含格式为 language_COUNTRY 的变量内容的文件。字符集LANG
- 命令输出由终端按照自己的配置进行解释
sed
我使用配置了字符集的变量和配置了 ISO-8859-1 (latin1) 编码的终端重现了您的输出:LANG
UTF-8
> export LANG=fr_FR.UTF-8; echo "latin1"; sed 's/.*/x/' critic_latin1 ; echo "utf-8"; sed 's/.*/x/' critic_utf8; echo "latin1/g"; sed 's/./x/g' critic_latin1; echo "utf-8/g"; sed 's/./x/g' critic_utf8
latin1
xùb
utf-8
x
latin1/g
xùx
utf-8/g
xxx
一个带有 UTF-8 的值,据说可以处理 UTF-8 字符,但在 ur 中,您有一个以 ISO-8859-1 编码的字符(只有一个字节)。此字符在 UTF-8 中无效。所以不处理未知(无效)字符。LANG
sed
critic_latin1
ù
sed
如果要处理与变量编码不同的文件,请像这样使用前缀:LANG
LANG=...
> export LANG=fr_FR.ISO-8859-1; echo "latin1"; sed 's/.*/x/' critic_latin1 ; echo "utf-8"; sed 's/.*/x/' critic_utf8; echo "latin1/g"; sed 's/./x/g' critic_latin1; echo "utf-8/g"; sed 's/./x/g' critic_utf8
latin1
x
utf-8
x
latin1/g
xxx
utf-8/g
xxxx
它对于数据文本文件(如 ISAM)非常有用。
评论
0赞
AmigoJack
1/15/2023
你说的“不特质”是指“不治疗”吗?
评论
.
.