如何从文件中删除非UTF-8字符
1. 概述
有时我们的文件可能包含无效字符或包含外语单词,这会使我们的程序因*“无效字符错误”*而崩溃。
在本教程中,我们将深入探讨该主题并了解什么是非 UTF-8 字符以及我们如何自动从文件中删除所有无效字符。
2. 什么是非UTF-8字符
**UTF-8 是 Unicode 的编码系统,可以将任何 Unicode 字符转换为匹配的唯一二进制字符串。**它还可以将二进制字符串转换为其各自的 Unicode 字符,因此具有“UTF(Unicode 转换单元)”前缀。
UTF-8 是独一无二的,因为它以单字节为单位表示字符,每个字节包含 8 位,因此具有“-8”后缀。
非 UTF-8 字符是 UTF-8 编码不支持的字符,它们可能包含来自不受支持的外国语言的符号或字符。
让我们看一下一些包含非 UTF-8 字符的字符串:
İnanç Esasları
İnanç Esasları
��� ����
如果我们试图将这些字符存储到一个变量或运行一个包含它们的文件,我们将得到一个错误。
3.过滤无效的UTF-8字符
包含非 UTF-8 字符的文件在由实用程序处理或由某些文本编辑器打开时会产生错误。让我们看一下在不同语言中可能出现的错误类型。
3.1. Python 中的一个错误
这是我们可以在 python 上预期的错误:
#### Truncated ####
UnicodeDecodeError: 'utf-8' codec cannot decode byte 0xf1 in position 933: invalid continuation byte
None
3.2. JavaScript 中的一个错误
让我们看一下 JavaScript 中预期的错误:
#### Trunctated ####
Uncaught SyntaxError: Unexpected identifier
3.3. Perl 中的一个错误
最后,让我们看看 Perl 中的错误:
Malformed UTF-8 character (fatal)
4. 如何在文件中查找非 UTF-8 字符
我们可以使用grep 轻松找到文件中的所有非 UTF-8 字符。**假设我们已将语言环境 **设置为 UTF-8。
让我们在终端中输入以下命令来打印出所有包含非 UTF-8 字符的行:
grep -axv '.*' FILE
以下是此命令的每个部分代表的内容:
- **-a, –text:**将我们的文件视为文本,从而防止grep在发现无效字符时中止。
- **-x ‘.*’ (–line regexp):**匹配包含任何 UTF-8 字符的完整行。
- **-v, –invert match:**反转我们的输出显示不匹配的行。
- **FILE:**表示我们要检查无效字符的文件。
让我们创建一个名为 test.txt 的文件,并向其中添加一些带有无效字符的随机文本:
$ touch test.txt
然后让我们向其中添加以下文本:
2.3.1 U-0000D7FF = ed 9f bf = "������"
This just some random text
More random text. Blogdemo is awesome!
现在让我们使用我们的grep命令来查找我们新创建的测试文件中的所有无效字符:
$ grep -axv '.*' test.txt
2.3.1 U-0000D7FF = ed 9f bf = "������"
但这仅在我们需要查找无效字符时对我们有用。在下一节中,我们将了解如何查找和删除文件中的无效字符。
5. 如何自动删除非UTF-8字符
要自动查找和删除非 UTF-8 字符,我们将使用iconv 命令。它在 Linux 系统中用于将文本从一种字符编码转换为另一种字符编码。
让我们看看如何使用此命令和其他标志的组合来删除无效字符:
$ iconv -f utf-8 -t utf-8 -c FILE
我们可以分解上面的命令来找出每个部分在做什么:
- **-f:**表示原始文件格式。我们在上面的示例中将其定义为 utf-8
- **-t:**表示我们要转换成的目标文件格式。
- **-c:**跳过任何无效序列
- **FILE:**表示我们要从中删除无效字符的文件。
**默认情况下,清除的数据将写入我们终端的标准输出。为了保存我们所做的更改,我们需要指定一个文件来保存更改。**我们可以使用以下任一命令来保存更改:
$ iconv -f utf-8 -t utf-8 -c FILE.txt -o NEW_FILE
或者
$ iconv -f utf-8 -t utf-8 -c FILE.txt > NEW_FILE
让我们使用上面创建的测试文件来删除所有无效字符并将更改保存到名为“test_clean.txt”的不同文件中:
$ iconv -f utf-8 -t utf-8 -c test.txt > test_clean.txt
或者
$ iconv -f utf-8 -t utf-8 -c test.txt -o test_clean.txt