了解LC_ALL = C及其对标准英文字符的含义

时间:2018-09-17 20:37:49

标签: utf-8 character-encoding cygwin text-files ascii

请原谅我处理这个问题的笨拙方式,到目前为止,我在字符编码主题上学到的一切都已经过去了几个小时,而且我知道我已经不在了深度。可以在网站上的其他位置(例如在我的链接问题中)回答该问题,但是如果回答了这些问题,那么这些回答就太密集了,以至于我无法确切了解其中的结论。

我经常需要{ for f in $pathToFiles do $stuff done } || { echo "Failed to complete loop"; exit 255; } 浏览文本文件过大的文件夹(总计超过100GB)。我已经阅读了有关如何使用LC_ALL=C can speed this up considerably的信息,但是我想确保在自己搜索的won't compromise the accuracy中使用{{3}}。

文件很旧,并且已经通过许多不同的在线资源传递,因此可能包含来自许多不同编码(包括UTF-8)的混杂字符。 (顺便说一句,单个文件是否可能包含多种编码的字符?)

与我有关的大部分事情是:如果我想在数据中搜索给定的grep,可以期望数据中存在的每个字母b都被编码为ASCII,还是可以将同一字母也编码为UTF-8?

或者换句话说,ASCII字符是否总是且仅是ASCII?如果甚至标准的英语字符都可以编码为UTF-8,并且使用b会忽略所有UTF-8字符,那么这意味着我的搜索将丢失非ASCII的搜索词,这显然会并不是我想要的行为,并且对于将LC_ALL=C grep用作LC_ALL=C来说是一个很大的障碍。

1 个答案:

答案 0 :(得分:0)

关于了解UTF-8和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 = en_US.UTF-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秒的重复容忍度之内