【问题标题】:Concatenating files in Windows Command Prompt and the string ""在 Windows 命令提示符和字符串“”中连接文件
【发布时间】:2020-11-06 20:28:29
【问题描述】:

我正在使用 Windows 连接文件。我使用了 TYPE 和 COPY 命令,得到了相同的工件。在我的原始文件加入新文件的地方,插入字符串“”(即十进制:139 175 168 十六进制:8BAFA8)。

我该如何解决这个问题?您是否可以提供一个简单的解释来避免这种情况。为什么会发生这种情况?

【问题讨论】:

  • 我猜这是某种编码规范,要么是字节顺序标记,要么是类似的东西,表示用于以下文件的编码类型。这些字符很可能作为您当时附加的文件中的前 3 个字符存在。
  • 确定这些是字节吗?字符  完全匹配 UTF-8 字节顺序标记,但这是不同的字节值。
  • 您正在查看一个表格,其中包含 MSDOS 使用的过时代码页之一,但仍由 Windows 中的所谓“DOS 窗口”或“DOS 框”模拟。但现代(自 2003 年以来)Windows 程序(如记事本)使用一组不同的代码页——美国和西欧通常使用code page 1252。在 1252 中,这三个字符是 EF BB BF,它们是 U+FEFF 的 UTF8。 @LasseV.Karlsen
  • …或代码页65001?无论如何,type 不会在使用重定向后立即更改或转换任何内容,因此它处于二进制模式; copy 具有 /A(ASCII 文本文件)和 /B(二进制文件)选项,您可能想尝试一下……
  • 如果您在 Windows 中运行 cmd.exe,那么 它不是 DOSDOS and cmd.exe 是完全不同的东西,所以如果您实际上不运行 DOS,请不要将其称为 DOS。谁说“不要使用 DOS”?命令行实际上是做很多事情的首选方式,因为它通常比具有许多 GUI 不提供的选项的 GUI 强大得多

标签: windows text unicode cmd byte-order-mark


【解决方案1】:

额外的字节是 UTF-8 编码签名。 Unicode 字节顺序标记 U+FEFF 以 UTF-8 编码并写入文件的开头,以指示文件以 UTF-8 编码。这不是必需的,但 Windows 假定文本文件以本地 ANSI 编码(通常是 Windows-1252)编码,除非出现 BOM。

许多文件工具不知道这一点(DOS 副本就是其中之一),因此连接文件可能很麻烦。

如今,对编码一无所知通常会带来麻烦。您不能简单地连接两个未知编码的文本文件...它们可能不同。

如果您知道编码,请使用了解编码的工具。这是一个非常用 Python 编写的基本连接脚本,它也可以转换编码。

# cat.py
import sys

if len(sys.argv) < 5:
    print('usage: cat <in_encoding> <out_encoding> <outfile> <infile> [infile...]')
else:  
    with open(sys.argv[3],'w',encoding=sys.argv[2]) as fout:
        for file in sys.argv[4:]:
            with open(file,'r',encoding=sys.argv[1]) as fin:
                fout.write(fin.read())

给定两个带有 UTF-8 w/ BOM 编码的文件,此命令将输出 UTF-8(无 BOM):

cat.py utf-8-sig utf-8 out.txt test1.txt test2.txt

关于 Python 的附注:utf-8-sig 编码读取文件并从数据中删除 BOM如果存在,因此它可用于读取任何带有或不带有 BOM 的 UTF-8 文件。 utf-8-sig encoding 在文件开头写入 BOM,但 utf-8 没有。

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2012-12-08
    • 2021-06-19
    • 2018-12-08
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多