utf-8 - 了解 LC_ALL=C 及其对标准英文字符的影响
问题描述
请原谅我处理这个问题的笨拙方式,到目前为止我在字符编码主题上学到的一切都是在过去的几个小时内,我知道我已经超出了我的深度。这可能会在网站的其他地方得到回答,例如在我的链接问题中,但如果有,这些答案太密集,我无法准确理解其中的结论。
我经常需要grep
浏览过大的文本文件(总计超过 100GB)的文件夹。我已经阅读了有关 using 如何大大LC_ALL=C
加快 这一速度的文章,但我想确保这样做不会影响搜索的准确性。
这些文件很旧,并且通过了许多不同的在线资源,因此可能包含来自许多不同编码的混乱字符,包括 UTF-8。(顺便说一句,单个文件是否可以包含来自多种编码的字符?)
我最关心的是:如果我想b
在我的数据中搜索一个给定的值,我是否可以期望b
数据中存在的每个字母都被编码为 ASCII,或者同一个字母也可以被编码为 UTF-8?
或者换一种说法,ASCII 字符是否始终是 ASCII 字符?如果即使是标准英文字符也可以编码为 UTF-8,并且 usingLC_ALL=C grep
会忽略所有 UTF-8 字符,那么这意味着我的搜索会错过非 ASCII 格式的搜索词,这显然不是我想要,并且会成为采用LC_ALL=C
for的一个相当大的障碍grep
。
解决方案
关于理解 UTF-8 vs ASCII,下面的很好
http://kunststube.net/encoding/
https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer -绝对肯定-必须知道-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 秒内的重复容差范围内
推荐阅读
- sql - 使用多个条件 AND / OR 的性能
- javascript - 为什么 JavaScript Promise Catch 没有被触发
- html - web-publisher 如何阻止 Amazon Affiliate DEEP-LINKS 在 Amazon App 中打开
- python - 如何根据标签绘制具有不同颜色的配对数据
- java - 在 RecyclerView 中的扩展项目上使用带有 ChangeBounds 的 TransitionManager 与 layout_height: match_constraint 结合使用会产生奇怪的视觉效果
- c++ - C ++中int的最小大小是多少?
- tizen - 如何在三星智能电视的 Tizen 浏览器中调试代码
- c++ - 为什么我不能使用实现 operator unsigned int() 的类作为 Visual C++ 32 位中的数组索引?
- python - Python v/s MATLAB 中的 SVD 命令
- python - git graph 父子表格格式