string - 从文本文件中删除二进制控制字符

标签 string windows batch-file control-characters

我有一个包含二进制控制字符的文本文件,例如“^@”和“^M”。当我尝试直接对文本文件执行字符串操作时,控制字符使脚本崩溃。

通过反复试验,我发现 more 命令会去除控制字符,以便我可以正确处理文件。

more file_with_control_characters.not_txt > file_without_control_characters.txt

这被认为是一种好方法,还是有更好的方法从文本文件中删除控制字符? more 在 Windows 8 之前的操作系统中是否有此行为?

最佳答案

当然,您不想简单地删除所有控制字符。换行符和制表符也是控制字符,您不想删除它们。

我假设您的 ^M 是一个回车符,而 ^@ 是一个 NULL 字节。回车不会给您带来问题,并且 MORE 不会删除它们。但是,如果您的实用程序需要 ASCII 文本文件,NULL 字节可能会导致问题。

您的输入文件很可能是 UTF-16。 MORE 正在将 UTF-16 转换为 ANSI(扩展 ASCII)格式,这确实有效地删除了 NULL 字节。它还将非 ASCII 值转换为十进制 128 - 255 字节值范围内的扩展 ASCII 字符。我相信它使用您的事件代码页 (CHCP) 值来确定哪些字符映射到哪里,但我并不肯定。

您应该注意一些其他问题。

  • MORE会将所有Tab字符转换为一系列空格,您无法控制多少个空格(根据行中的当前位置而定)。

  • MORE 将始终以\r\n(回车和换行)结束每一行。

  • MORE 还会删除文件开头的两字节 BOM(如果存在)。 BOM表示UTF-16格式。但是 MORE 不需要 2 字节的 BOM 指示符,它会无论如何将 UTF-16 转换为 ANSI。

  • 最后,如果您的文件超过 64K 行,MORE 可能会无限期挂起。

如果 MORE 对您有用,请务必使用它。

另一种选择是使用 TYPE,它也会将 UTF-16 转换为 ANSI:

type "yourFile.txt" >"newFile.txt"

TYPE 肯定会根据事件代码页映射非 ASCII 代码。

TYPE 与 MORE 的转化方式存在一些差异

  • TYPE 的一个优点是它不会将制表符转换为空格。

  • 另一个优点是它不会挂起大文件。

  • 另一个区别(可能好,也可能坏)是它不会向没有行终止符的行添加行终止符。

  • TYPE 的一个潜在缺点是如果输入缺少 BOM,它不会将 UTF-16 转换为 ANSI。

关于string - 从文本文件中删除二进制控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34378907/

相关文章:

java - 字符串以 '\n' 结尾最有效的操作方法是什么?

javascript - 从 JavaScript 中的字符串中删除圆括号 - ( 和 )

windows - 在 Windows 上安装 PacketBeat

c++ - 如何将多个图标添加到单个 TreeView 项目?

batch-file - 如何使用批处理命令关闭特定文件

batch-file - 复制文件列表 (txt)

regex - 解析特定格式的输入

php - 在 PHP 中使用 preg_replace() 中的每个匹配项

windows - 如何配置 IIS 以托管多个网站?

variables - 批处理文件多个标记多个变量