理解 LC_ALL=C 及其对标准英文字符的含义
Understanding LC_ALL=C and its implications for standard English characters
请原谅我处理这个问题的笨拙方式,到目前为止,我所学到的关于字符编码主题的所有知识都是最近几个小时的,我知道我'我超出了我的深度。这可能会在网站的其他地方得到回答,比如在我的链接问题中,但如果有的话,这些答案太密集了,我无法准确理解其中的结论。
我经常需要 grep
浏览过大文本文件(总计超过 100GB)的文件夹。我已经了解了如何使用 LC_ALL=C
can speed this up considerably, but I want to be sure that doing so won't compromise the accuracy 我的搜索。
这些文件是旧的并且已经通过许多不同的在线来源,因此可能包含来自许多不同编码(包括 UTF-8)的混乱字符。 (顺便说一句,单个文件是否可以包含来自多种编码的字符?)
我最关心的是:如果我想在我的数据中搜索给定的 b
,我是否可以期望数据中存在的每个字母 b
都被编码为ASCII,或者同一个字母也可以编码为 UTF-8?
或者换句话说,ASCII 字符 总是且排他地 ASCII 吗?如果连标准的英语字符都可以编码为 UTF-8,并且使用 LC_ALL=C grep
会忽略所有 UTF-8 字符,那么这意味着我的搜索会错过不在 ASCII 中的搜索词,这显然会这不是我想要的行为,并且对于 grep
.
采用 LC_ALL=C
将是一个相当大的障碍
关于UTF-8 vs ASCII的理解,下面这些都很好
http://kunststube.net/encoding/
https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
对于含有少量非ASCII字符的UTF-8文件grep的时间差异,使用LC_ALL=C或LANG=C与标准LANG=[=22=基本没有区别]-8 或类似的。
在 Cygwin 64 位上执行的测试,在 20GB 的文本上重复搜索 1000 次:
$ time for i in $(seq 1000) ; do grep -q LAPTOP-82F08ILC wia-*.log ; done
real 0m53.289s
user 0m7.813s
sys 0m31.635s
$ time for i in $(seq 1000) ; do LC_ALL=C grep -q LAPTOP-82F08ILC wia-*.log ; done
real 0m53.027s
user 0m7.497s
sys 0m31.010s
s
$ ls -sh wia-*
10G wia-1024.log 160M wia-16.log 2.5G wia-256.log 40M wia-4.log 639M wia-64.log
1.3G wia-128.log 20M wia-2.log 320M wia-32.log 5.0G wia-512.log 80M wia-8.log
两种情况下的差异都在 53-55 秒的重复容差范围内
请原谅我处理这个问题的笨拙方式,到目前为止,我所学到的关于字符编码主题的所有知识都是最近几个小时的,我知道我'我超出了我的深度。这可能会在网站的其他地方得到回答,比如在我的链接问题中,但如果有的话,这些答案太密集了,我无法准确理解其中的结论。
我经常需要 grep
浏览过大文本文件(总计超过 100GB)的文件夹。我已经了解了如何使用 LC_ALL=C
can speed this up considerably, but I want to be sure that doing so won't compromise the accuracy 我的搜索。
这些文件是旧的并且已经通过许多不同的在线来源,因此可能包含来自许多不同编码(包括 UTF-8)的混乱字符。 (顺便说一句,单个文件是否可以包含来自多种编码的字符?)
我最关心的是:如果我想在我的数据中搜索给定的 b
,我是否可以期望数据中存在的每个字母 b
都被编码为ASCII,或者同一个字母也可以编码为 UTF-8?
或者换句话说,ASCII 字符 总是且排他地 ASCII 吗?如果连标准的英语字符都可以编码为 UTF-8,并且使用 LC_ALL=C grep
会忽略所有 UTF-8 字符,那么这意味着我的搜索会错过不在 ASCII 中的搜索词,这显然会这不是我想要的行为,并且对于 grep
.
LC_ALL=C
将是一个相当大的障碍
关于UTF-8 vs ASCII的理解,下面这些都很好
http://kunststube.net/encoding/
https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
对于含有少量非ASCII字符的UTF-8文件grep的时间差异,使用LC_ALL=C或LANG=C与标准LANG=[=22=基本没有区别]-8 或类似的。
在 Cygwin 64 位上执行的测试,在 20GB 的文本上重复搜索 1000 次:
$ time for i in $(seq 1000) ; do grep -q LAPTOP-82F08ILC wia-*.log ; done
real 0m53.289s
user 0m7.813s
sys 0m31.635s
$ time for i in $(seq 1000) ; do LC_ALL=C grep -q LAPTOP-82F08ILC wia-*.log ; done
real 0m53.027s
user 0m7.497s
sys 0m31.010s
s
$ ls -sh wia-*
10G wia-1024.log 160M wia-16.log 2.5G wia-256.log 40M wia-4.log 639M wia-64.log
1.3G wia-128.log 20M wia-2.log 320M wia-32.log 5.0G wia-512.log 80M wia-8.log
两种情况下的差异都在 53-55 秒的重复容差范围内