将HTML实体(& #nnnn;)转换为纯UTF-8

时间:2010-06-22 13:05:16

标签: html unix utf-8

我们有HTML源文件,其中包含编码为&#nnnn;的特殊字符,如下所示:

außergewöhnlich

我们希望将它们转换为普通的UTF-8:

  

außergewöhnlich

有没有什么小工具可以做到?

3 个答案:

答案 0 :(得分:4)

您可以使用perl和HTML::Entities执行此操作。

echo 'echo 'außergewöhnlich' |
perl -MHTML::Entities -pe'binmode STDOUT, ":utf8"; HTML::Entities::decode_entities($_)'

答案 1 :(得分:3)

我认为ascii2uni工具将执行所需的转换。

工具的大小约为几百千字节,比上面提到的lynx小。

答案 2 :(得分:-1)

这是一个完整的shell解决方案(显然你没有指定要使用的'语言')。

foo='außergewöhnlich'
echo "$foo"

außergewöhnlich

eval "$(printf '%s' "$foo" | sed 's/^/printf "/;s/&#0*\([0-9]*\);/\$( [ \1 -lt 128 ] \&\& printf "\\\\$( printf \"%.3o\\201\" \1)" || \$(which printf) \\\\u\$( printf \"%.4x\" \1) )/g;s/$/\\n"/')" | sed "s/$(printf '\201')//g"

außergewöhnlich

评论:这项工作还有破折号(用作Ubuntu的标准shell)。我们必须在某些地方使用GNU printf,因为dash中的内置printf不知道\ u转换为Unicode。此外,GNU printf有点愚蠢,因为它拒绝使用从0到127的代码点,这在UTF中是完全合法的。因此,我们必须使条件为0并且在0-128范围内使用八进制。 最后一个sed用于你需要转换像换行符这样的字符( )或Tab()。我们使用一个技巧,以便命令替换保留这些尾随字符,然后我们删除最后一个sed的“技巧”。如果您的输入符合Unicode,则不应该使用用于此的字符,因此它应该是安全的。