4

我在包含特殊字符的字符串上使用match函数时遇到问题。awk考虑文件test.awk

{
    match($0,"(^.*)kon",a);
    print a[1];
}

以及相应的测试文件“test.txt”,内容为“Testing Håkon”(注意挪威字符“å”)。该文件以“iso-8859-1”编码,长度为 14 字节。文件的十六进制转储由xxd -p test.txtas给出

54657374696e672048e56b6f6e0a

从中我们可以看到,挪威字符“å”已经用十六进制数字“e5”进行了编码。也就是说,该文件使用了iso-8859-1编码。

跑步

awk  -f test.awk test.txt

在终端没有给出任何内容..而正确的输出应该是“Testing Hå”..

运行locale命令的输出是:

LANG=en_DK.UTF-8
LANGUAGE=en_US:
LC_CTYPE="en_DK.UTF-8"
LC_NUMERIC="en_DK.UTF-8"
LC_TIME="en_DK.UTF-8"
LC_COLLATE="en_DK.UTF-8"
LC_MONETARY="en_DK.UTF-8"
LC_MESSAGES="en_DK.UTF-8"
LC_PAPER="en_DK.UTF-8"
LC_NAME="en_DK.UTF-8"
LC_ADDRESS="en_DK.UTF-8"
LC_TELEPHONE="en_DK.UTF-8"
LC_MEASUREMENT="en_DK.UTF-8"
LC_IDENTIFICATION="en_DK.UTF-8"
LC_ALL=

这表明“LANG”变量设置为 utf-8 编码。

4

2 回答 2

2

我已将您的代码修改为:

{
    match($0,"(^.*)kon",a);
    print ">>>" a[1] "<<<";
}

GNU Awk 3.1.6在 Windows 7 下运行的结果:

>>>Hå<<<

在 Ubuntu 运行下,GNU Awk 3.1.8我得到:

>>><<<

为了获得所需的输出,我不得不临时更改语言环境设置并翻译:

LC_ALL=ISO_8859-1 awk -f test.awk test.txt | iconv -f ISO_8859-1 -t UTF-8
于 2013-05-26T15:14:39.673 回答
1

awk这里不是问题。您locale期望 UTF-8 编码,但您的文件正在使用iso-8859-1,因此请设置您locale以匹配您的文件,反之亦然。

注意:的第二个参数match()应该是一个正则表达式并且;不需要尾随

{
    match($0,/(^.*)kon/,a)
    print a[1]
}
于 2013-05-26T15:09:56.757 回答