【问题标题】:Replacing German Umlauts in an ISO 8859-15 file on an UTF 8 system在 UTF 8 系统上替换 ISO 8859-15 文件中的德语变音符号
【发布时间】:2015-04-20 15:50:48
【问题描述】:

我有一堆我用 python 和 pandas 读取和绘制的 CSV 文件。

要在我的图中添加一些关于文件(或者更确切地说是它所涉及的数据)的更多信息,我正在分析它们的标题,从中提取各种内容(测量点的位置、测量类型等) .

问题是 - 文件是德语的,因此包含很多变音符号(ü、ö、ä)。现在我可以很好地阅读和理解它们,但我的脚本不能。

所以我想简单地将它们替换为有效的 2 个字符表示(ü=ue,...),这样我就不必担心在 python 中使用 u'Ümlautstring'\xfcstring 之类的东西。

sed -i 's/\ä/ae/g' myfile.csv

根据谷歌的说法,应该可以解决问题,但它不起作用。

通过进一步研究,我找到了问题,但没有解决方案:

我的 csv 文件以 ISO 8859-15 编码,但我的 localeLANG=de_DE.UTF-8,据我了解,这意味着 sed 以 utf 8 形式搜索 ü,它不会在 ISO 8859-15 中找到。

那么我必须告诉 sed 什么才能找到我的变音符号?

到目前为止,我发现的大多数东西都建议使用 Perl,但这并不是一个真正的选择。

【问题讨论】:

  • 正确的解决方案是解码 8859-15 并将生成的 Unicode 规范化为合适的格式。 import unicodedata; decoded_normalized = unicodedata.normalize('NFKD', open(file, 'r').read().decode('iso-8859-15'))

标签: python utf-8 sed diacritics iso-8859-15


【解决方案1】:

您可以使用 LC_* envvars 来防止 sed 执行任何 UTF-8 解释,并使用 \x 转义序列来通过 ISO-8859-15 中的十六进制值指定变音符号。长话短说,

LC_ALL=C sed 's/\xc4/Ae/g;s/\xd6/Oe/g;s/\xdc/Ue/g;s/\xe4/ae/g;s/\xf6/oe/g;s/\xfc/ue/g;s/\xdf/ss/g' filename

应该适用于所有 ÄÖÜäöüß,我猜这就是您关心的人。

【讨论】:

  • ...直到有人在昂古莱姆或圣保罗测量某些东西。
  • 谢谢!这样可行。但据我了解,这仅适用于 ISO 8859-15 文件,而 UTF-8 会失败吗?我想在我的 python 脚本中寻找文件编码是明智的,这样我就可以切换到 UTF-8 后备(或者更确切地说,后备?)我应该有这样的文件吗?
  • 或者你可以iconv在处理之前把所有东西都转成UTF-8。
  • @JC_CL 你不应该让它在 UTF-8 文件上运行,这是正确的。如果您不确定文件的编码,请使用recode 之类的工具将其转换为已知编码并使用它。 (iconv 要求您知道源编码,而recode 会为您猜测)。如果你仍然这样做,你可以放弃特殊的 iso8859-15 处理,尽管你仍然需要知道你想要替换的代码点以及替换它们的内容。或者您可以让脚本使用 UTF-8 数据。
  • @tripleee 好点!目前我不需要它,但当我使用国际数据时,我会记住它。不就是简单地将s/\xe3/a/g; 添加到 sed 行吗?如果我理解正确,它只是来自this list\x + HEX
猜你喜欢
  • 2019-09-28
  • 2012-07-26
  • 2011-12-08
  • 1970-01-01
  • 2012-10-01
  • 2012-06-30
  • 2016-03-06
  • 1970-01-01
  • 2016-07-14
相关资源
最近更新 更多