【问题标题】:Removing lines containing encoding errors in a text file删除文本文件中包含编码错误的行
【发布时间】:2013-10-02 12:02:51
【问题描述】:

我必须警告你我是一个初学者。我有一个文本文件,其中一些行包含编码错误。通过“错误”,这是我在 linux 控制台中解析文件时得到的结果(问号而不是字符):

我想删除显示那些“问号”的每一行。我试图 grep -v 有问题的字符,但它不起作用。该文件本身是 UTF8,我猜有些行来自以另一种格式编码的文本。我知道我可以找到一种方法来正确地重新转换它们,但我现在只想让它们消失。

请问您有什么想法吗?

PS:有些行包含显示良好的变音符号。 “字符串”命令似乎删除了太多“好”行。

【问题讨论】:

  • 你试过dos2unix吗?以xinotes.org/notes/note/1377 为例
  • 它说它是一个二进制文件,不能处理它。
  • 嗯,我觉得我发的太快了。 dos2unix 解决了新行问题,但我认为它并没有解决这些编码问题。让我们等待有更多知识的人回答:)
  • 好的,谢谢你看看 fedorqui !

标签: text encoding utf-8 grep


【解决方案1】:

在处理非 ANSI 字符编码的 mojibake 时,您必须检查 2 件事:

  1. 文件真的是用X 编码的吗? (X 在您的情况下是没有 BOM 的 UTF-8。您可能正在尝试将 UTF-8 WITH BOM、UTF-16、latin-1 等读取为 UTF-8,这将是问题所在)。尝试读入(不转换为)其他编码,看看它们是否适合。

  2. 您的语言环境或文本编辑器是否设置为以 UTF-8 格式读取文件?如果不是,那可能就是问题所在。检查支持并找出如何更改设置。在 linux 中尝试localesetlocale 命令来检查并正确设置它。

我喜欢 Windows 的notepad++(也可以使用 wine 在 linux 中完美运行)让您设置任何想要读取文件的编码而不尝试转换它(当然,如果您设置的不是文件被编码在你只会看到那些奇怪的字符),并且还有一个不同的选项,它允许你将它从一种编码转换为另一种。这对我很有用。

如果您是初学者,您可能会对这个article 感兴趣。它简要而清晰地解释了字符编码的内容、原因和方法。

[编辑] 如果以上都失败了,即使是windows-1252之类的ANSI编码,我刚刚学了here如何使用tr unix命令去除非ascii字符,转将其转换为 ASCII(但请注意,此输出中会丢失有关额外字符的信息并且不会返回,因此请保留输入文件以防万一您找到更好的修复方法):

 tr -cd '\11\12\40-\176' < $INPUT_FILE > $OUTPUT_FILE

或者,如果你想去掉整行:

 grep -v -P "[^\11\12\40-\176]" $INPUT_FILE > $OUTPUT_FILE

[EDIT 2] 这个答案here 很好地猜测了如果您的文件上没有任何编码会发生什么(不幸的是,唯一直接的解决方案似乎是删除那些有问题的字符)。

【讨论】:

  • 您好,感谢您的回答!我试图改变 Kwrite 中的编码来读取那些神秘的字符。 (UTF16、ISO 等)。我都做了。它不会改变任何东西。这就是为什么我正在寻找一种方法来使用 sed 或 grep 删除这些行。
  • 不客气 :-) 当然必须有一种适合的编码。我不熟悉 kwrite 编码设置的工作原理,但它可能正在尝试转换文件而不是使用不同的编码来读取它。如果您知道您的文件来自哪个地区/语言,则没有太多选择可以尝试。还有一些 windows 字符集可能会给你在 linux 中带来一些麻烦,这就是为什么我建议如果你没有 windows 机器,notepad++ 可以在 wine 中运行。
  • 这是完美的 elcodedocle。但是有没有办法删除整行,而不是带有 tr 的字符?我阅读了手册页,但找不到任何东西。也许有办法在 sed 中使用相同的表达式?
  • 改用grep -v -P "[^\11\12\40-\176]" infile &gt; outfile
  • 非常感谢。这就像一个魅力,正是我想做的。
【解决方案2】:

您可以使用微型 Perl 脚本,例如:

perl -pe 's/[^[:ascii:]]+//g;' my_utf8_file.txt

【讨论】:

  • 你好,列夫。谢谢你的回答。我刚刚尝试过,但这似乎删除了我所有的口音(é,à等)和外来字符(例如:я)。我真的不知道怎么了。文件本身不是很明显的 utf8。我的意思是它“应该是”,但 uchardet 根本不识别编码。
  • 您好,您能否给我们一个文件样本(当然是二进制文件),如果您有这些工具,可以使用十六进制格式,即使用 hexdump 或 xxd 吗?
  • 我看到了一个类似的问题:best-way-to-convert-text-files-between-character-sets。
  • 感谢您的建议。我查了一下,发现了一些有趣的结果:l�ttam其实是中文,当从utf16解码为utf18时:encoder.mattiasgeniar.be/index.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多