对于源英文文件位于 docbook xml 中的官方 Ubuntu 文档,要求仅使用 ASCII 字符。我们使用“检查器”命令行(参见此处)。
grep --color='auto' -P -n "[\x80-\xFF]" *.xml
但是,该命令有一个缺陷,显然不是在所有计算机上,它都会遗漏一些带有非 ASCII 字符的行,从而可能导致错误的 OK 结果。
有人对 ASCII 检查器命令行有更好的建议吗?
有兴趣的人可以考虑使用这个文件(文本文件,而不是 docbook xml 文件)作为测试用例。非 ASCII 字符的前三行是第 9、14 和 18 行。检查中遗漏了第 14 和 18 行:
$ grep --color='auto' -P -n "[\x80-\xFF]" install.en.txt | head -13
9:Appendix F, GNU General Public License.
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
394:1.1.1. Sponsorship by Canonical
402:1.2. What is Debian?
456:1.2.1. Ubuntu and Debian
461:1.2.1.1. Package selection
475:1.2.1.2. Releases
501:1.2.1.3. Development community
520:1.2.1.4. Freedom and Philosophy
534:1.2.1.5. Ubuntu and other Debian derivatives
555:1.3. What is GNU/Linux?
您可以使用我在 GitHub 上托管的 Python 3 脚本打印文件的所有非 ASCII 行:
GitHub: ByteCommander/编码检查
您可以克隆或下载整个存储库,也可以简单地保存文件
encoding-check
并使用chmod +x encoding-check
.然后你可以像这样运行它,将要检查的文件作为唯一参数:
./encoding-check FILENAME
如果它位于您当前的工作目录中,或者.../path/to/encoding-check FILENAME
如果它位于/path/to/
,或者...encoding-check FILENAME
如果它位于作为$PATH
环境变量一部分的目录中,即/usr/local/bin
或~/bin
.如果没有任何可选参数,它将打印找到非 ASCII 字符的每一行及其编号。最后,有一个摘要行告诉您文件总共有多少行以及其中有多少行包含非 ASCII 字符。
此方法保证正确解码所有 ASCII 字符并检测绝对不是 ASCII 的所有内容。
这是一个在包含您给定的前 20 行的文件上运行的示例
install.en.txt
:但是脚本有一些额外的参数来调整检查的编码和输出格式。查看帮助并尝试:
因为
--encoding
,Python 3 知道的每个编解码器都是有效的。试一试,在最坏的情况下,您会收到一些错误消息...如果您想查找非 ASCII 字符,也许您应该反转搜索以排除 ASCII 字符:
例如:
在第 9、330、337 和 359 行中,存在Unicode 不间断空格字符。
您得到的特定输出可能是由于
grep
对 UTF-8 的支持。对于 Unicode 语言环境,其中一些字符可能与普通的 ASCII 字符比较相等。在这种情况下,强制 C 语言环境将显示预期结果:这个 Perl 命令主要替换了那个
grep
命令(缺少的是颜色):n
: 导致 Perl 在你的程序周围假设以下循环,这使得它迭代文件名参数,有点像 sed -n 或 awk:-e
: 可用于输入一行程序。/[\x80-\xFF]/&&print($ARGV."($.):\t^".$_)
:如果该行包含范围内的字符,则\x80-\xFF
打印当前文件的名称、当前文件的行号、一个:\t^
字符串和当前行的内容。包含问题中的示例文件和仅包含
ààààà
换行符的文件的示例目录上的输出: