代码之家  ›  专栏  ›  技术社区  ›  Hashim Aziz

理解LC iu ALL=C及其对标准英语字符的影响

  •  0
  • Hashim Aziz  · 技术社区  · 6 年前

    请原谅我在回答这个问题时的笨拙,到目前为止,我在字符编码这一主题上所学的一切都是在过去的几个小时里学到的,我意识到我已经力不从心了。这个问题可能会在网站的其他地方得到回答,比如在我的相关问题中,但如果有的话,这些答案太密集了,我无法确切理解其中的结论。

    我经常需要 grep 通过文件夹的超大文本文件(总计超过100GB)。我读过关于如何使用 LC_ALL=C can speed this up considerably won't compromise the accuracy

    这些文件很旧,并且通过了许多不同的在线来源,因此可能包含来自许多不同编码(包括UTF-8)的混乱字符。( 另外,一个文件是否可能包含来自多个编码的字符 ?)

    我最关心的是:如果我想搜索给定的 b 在我的资料里,我能期待每一封信吗 b 它存在于要编码为ASCII的数据中,还是同一个字母也可以被编码为UTF-8?

    或者换句话说,是ASCII字符 总是和排他性的 LC_ALL=C grep 如果忽略所有UTF-8字符,那么这就意味着我的搜索将丢失不在ASCII中的搜索词,这显然不是我想要的行为,并且会成为采用的一个相当大的障碍 LC全部=C 格雷普

    1 回复  |  直到 6 年前
        1
  •  0
  •   matzeri    6 年前


    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基本上没有区别_美国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秒的重复容忍范围内