gpt4 book ai didi

perl - 如果文件以小端或大端写入,如何检查 perl?

转载 作者:行者123 更新时间:2023-12-05 00:16:53 26 4
gpt4 key购买 nike

实际上我必须解析一些可以是任何形式的字节序(大或小)的文件。如果我使用一种编码并解析另一种编码,Perl 解释器就会死亡。

open (my $fh, "<:raw:encoding(UTF-16LE):crlf", $ARGV[0]) or die cannot open file for reading : $! \n";

或者
open (my $fh, "<:raw:encoding(UTF-16BE):crlf", $ARGV[0]) or die cannot open file for reading : $! \n";

输出(对于 LE 和 perl 编码为 BE 的文件)
UTF-16BE:Malformed HI surrogate dc00 at toASCII.pl line 123.

最佳答案

大多数 UTF-16le 文件都是有效的 UTF-16be 文件,反之亦然。例如,无法判断 0A 00表示 U+000A (UTF-16le) 或 U+0A00 (UTF-16be)。所以,假设没有 BOM ,你得猜。

可能的启发式(按可靠性降序排列):

  • U+FFFE 不是字符(保证)。
  • 如果文件以 FF FE 开头,那么它必须是UTF-16le。
  • 如果文件以 FE FF 开头,那么它必须是UTF-16be。

  • 如果文件不是有效的 UTF-16be,则它必须是 UTF-16le。
  • 如果文件不是有效的 UTF-16le,则它必须是 UTF-16be。

  • 如果文件在使用 UTF-16be 解码时包含非字符,则它必须是 UTF-16le。
  • 如果文件在使用 UTF-16le 解码时包含非字符,则它必须是 UTF-16be。
  • U+0A00 当前未分配,但 U+000A(LINE FEED)很常见。U+0D00 当前未分配,但 U+000D(CARRIAGE RETURN)很常见。
  • 如果文件包含 0A 000D 00 ,那么它可能是UTF-16le。
  • 如果文件包含 00 0A00 0D ,那么它可能是UTF-16be。

  • 如果文件在使用 UTF-16be 解码时包含未分配的字符,那么它可能是 UTF-16le。
  • 如果文件在使用 UTF-16le 解码时包含未分配的字符,那么它可能是 UTF-16be。
  • 基于文件格式知识的启发式方法。 ( Example )
  • 一个文件可能包含的 ASCII 字符多于字符数字 U+xx00
  • 如果文件包含很多 xx 00和少数 00 xx ,那么它可能是UTF-16le。
  • 如果文件包含很多 00 xx和少数 xx 00 ,那么它可能是UTF-16be。

  • 笔记:
  • #4 和 #5 说“它可能”而不是“它一定是”,因为今天未分配的内容明天可能会分配。
  • #3 包括 #1,但 #1 是一个廉价的测试。
  • #5 包括#4,但#4 几乎与#5 一样可靠,无需维护一长串随时间变化的未分配字符。

  • 您可以使用 :raw 在文件中啜饮,对其执行部分或全部上述测试以确定编码,然后使用 decodes/\r\n/\n/g .

    关于perl - 如果文件以小端或大端写入,如何检查 perl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41173102/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com