题
我是否正确假设“windows 文件”和“unix 文件”之间的唯一区别是换行符?
我们的系统已从 Windows 计算机迁移到 UNIX 计算机,并且在格式方面遇到了问题。
在文件被传送到我们的“传输系统”中的系统之前,我需要自动执行 unix/windows 之间的转换。我可能需要一些东西来确定当前格式以及将其转换为其他格式。如果只是换行符,那就是很大的区别,那么我正在考虑使用 java.io. 读取文件。据我所知,他们能够用 readLine 处理这两种情况。然后将每一行写回
while (line = readline)
print(line + NewlineInOtherFormat)
....
概括:
这只是文本文件中的差异,UNIX 使用单个换行 (LF) 来表示新行,Windows 使用回车/换行 (CRLF),而 Mac 仅使用 CR。
到哪个 塞布伊尔 详细说明:
OS X 使用 LF,与 UNIX 相同 - MacOS 9 及更低版本确实使用 CR
国家字符的字符编码也可能存在差异。没有“unix 编码”,但许多 linux 变体使用 UTF-8 作为默认编码。Mac OS(也是unix)使用自己的编码(macroman)。我不确定 Windows 默认编码是什么。
除了换行差异之外,如果文件在 Windows 上被视为 Unicode,则字节顺序标记可能会导致问题。
但是,您可能遇到的另一组问题可能与单/多字节字符编码有关。如果您看到奇怪的意外字符(不在行尾),那么这可能就是原因。特别是当您看到方框、问号、倒置问号、额外字符或意外的重音字符时。
在 Unix 上,以 .被隐藏。在 Windows 上,它是一个您可能无法轻松访问的文件系统标志。这可能会导致本应隐藏的文件现在在客户端计算机上变得可见。
两者之间的文件权限有所不同。您可能会发现,当您将文件复制到 UNIX 系统时,这些文件现在属于进行复制的用户并且具有有限的权限。您需要使用 chown/chmod 来确保正确的用户可以访问它们。
有一些工具可以帮助解决这个问题:
如果您只对文本文件的内容感兴趣,那么行结尾是不同的。看看像 dos2unix 这样的东西,它可能会有所帮助。
正如 pauldoo 所建议的,像 dos2unix 这样的工具非常有用。请注意,这些可能在您的 linux/unix 系统上作为 fromdos 或 tofrodos,甚至可能作为通用工具箱重新编码。
java 编码帮助
当写入文件或读取文件(您可以控制的)时,通常值得指定要使用的编码,因为大多数 Java 方法都允许这样做。然而,确保系统区域设置匹配可以减少很多麻烦
解决方案
这只是文本文件中的差异,UNIX 使用单个换行 (LF) 来表示新行,Windows 使用回车/换行 (CRLF),而 Mac 仅使用 CR。
二进制文件应该没有区别(即Windows 机器上的 JPEG 与 unix 机器上的相同 JPEG 是逐字节的。)
其他提示
国家字符的字符编码也可能存在差异。没有“unix 编码”,但许多 linux 变体使用 UTF-8 作为默认编码。Mac OS(也是unix)使用自己的编码(macroman)。我不确定 Windows 默认编码是什么。
但这可能是另一个麻烦来源(除了不同的换行符)。
你有什么问题?与换行相关的问题可以使用 unix 机器上的 dos2unix 或 unix2dos 程序轻松纠正
如果您只对文本文件的内容感兴趣,那么行结尾是不同的。看看类似的东西 DOS2UNIX, ,这可能对这里有帮助。
(当然,还有许多其他因素使 UNIX 和 Windows 文件不同,但我认为您现在对这些其他差异不感兴趣。)
除了给出的答案之外,您可能会发现不同文件系统的问题:
在 Unix 上,以 a 开头的文件 . 被隐藏。在 Windows 上,它是一个您可能无法轻松访问的文件系统标志。这可能会导致本应隐藏的文件现在在客户端计算机上变得可见。
两者之间的文件权限有所不同。您可能会发现,当您将文件复制到 UNIX 系统时,这些文件现在属于进行复制的用户并且具有有限的权限。你需要使用 chown/chmod 以确保正确的用户可以访问它们。
除了新线差异之外, 字节顺序标记 如果文件在 Windows 上被视为 Unicode,则可能会导致问题。
正如 pauldoo 所建议的,像 dos2unix 这样的工具非常有用。请注意,这些可能在您的 linux/unix 系统上为 弗洛多斯 或者 托夫罗多斯, ,或者甚至可能作为通用工具箱 重新编码.
但是,您可能遇到的另一组问题可能与单/多字节字符编码有关。如果您看到奇怪的意外字符(不在行尾),那么这可能就是原因。特别是当您看到方框、问号、倒置问号、额外字符或意外的重音字符时。
运行命令 语言环境 你的 *nix 盒子上会告诉你系统区域设置是什么。如果这与从 Windows 计算机传输过来的文本文件中使用的编码不同,那么有时可能会导致问题,具体取决于这些文件的使用情况。你可以使用非常强大的 重新编码 命令尝试在不同的字符集之间进行转换以及任何行结束问题。 重新编码-l 将向您显示该工具可以在之间转换的所有格式和编码。这可能是一个非常长的清单。
当写入文件或读取文件(您可以控制的)时,通常值得指定要使用的编码,因为大多数 Java 方法都允许这样做。然而,确保系统区域设置匹配可以减少很多麻烦。