Unix 如何处理文件中的特殊字符(ഀ;)

Unix 如何处理文件中的特殊字符(ഀ;),unix,bpel,Unix,Bpel,当我打开记事本时,我有一个文件看起来像这样++ A|B|C|D|E਍ഀ 31|HB|39|Ph|49਍ഀ 32|FB|38|Ph|59਍ഀ 当我试图从WinScp打开它时,它看起来如下所示 ÿþA|B|C|D|E 31|HB|39|Ph|49 32|FB|38|Ph|59 我想在BPEL文件适配器中读取此文件。但是我不能读它,因为{eol}不合适。而且我已经试过了਍ഀ 作为最后一行,但没

当我打开记事本时,我有一个文件看起来像这样++

         A|B|C|D|E਍ഀ
        31|HB|39|Ph|49਍ഀ
        32|FB|38|Ph|59਍ഀ
当我试图从WinScp打开它时,它看起来如下所示

        ÿþA|B|C|D|E

         31|HB|39|Ph|49

         32|FB|38|Ph|59
我想在BPEL文件适配器中读取此文件。但是我不能读它,因为{eol}不合适。而且我已经试过了਍ഀ 作为最后一行,但没有运气

PFA

<>

提前感谢,


阿披舍克

当你在这个文件上运行od-c时(见上面的注释),你发现:

0000000 377 376 A \0 | \0 B \0 | \0 C \0 | \0 D \0 
0000020 | \0 E \0 \r \n \0 \r \n \0 3 \0 1 \0 | \0 
0000040 H \0 B \0 | \0 3 \0 9 \0 | \0 P \0 h \0 
0000060 | \0 4 \0 9 \0 \r \n \0 \r \n \0 3 \0 2 \0 
0000100 | \0 F \0 B \0 | \0 3 \0 8 \0 | \0 P \0 
0000120 h \0 | \0 5 \0 9 \0 \r \n \0 \r \n \0 
0000136
让我们从头开始

你注意到前两个字节了吗?八进制377和376。别名0xFF 0xFE十六进制。这就是所谓的字节顺序标记(BOM)。它用于向必须读取文件的应用程序“传递”信息(编码和结束)

现在,如果BOM为0xFF 0xFE,则表示该文件包含编码为UTF-16的Unicode字符。确切地说,它是一个小的Endian UTF-16编码文件(UTF-16LE)

由于您的文件编码为UTF-16LE。。。每个字符都需要两个字节:

  • 第一个字符(拉丁文大写字母A)由“A\0”表示
  • 第二个字符是“|\0”
  • 第三个字符是“B\0”
  • 等等
到目前为止。。。这么好。问题是“\r\n”。如果文件编码为UTF-8,则此序列将是通常的CR LF,但BOM显示文件编码为UTF-16LE,因此

  • 回车应该用0x0D 0x00表示(在od-c中为\r\0)
  • 0x0A 0x00(\n\0在od-c中)的新行
您使用“\r\n”而不是“\r\0\n\0”这一事实会使不知道如何使用UTF-16LE编码“解释”这些字节的应用程序感到困惑。UTF-16LE中的序列“\r\n”无效,应用程序使用两个“框”来表示这些无效字节

简而言之:您的文件编码错误(一半是UTF-16LE,一半是UTF-8)。我猜有人用记事本或类似的东西来改变它的内容


您可以尝试使用iconv和/或sed来修复它。

在该文件上运行od-c时(请参见上面的注释),您会发现:

0000000 377 376 A \0 | \0 B \0 | \0 C \0 | \0 D \0 
0000020 | \0 E \0 \r \n \0 \r \n \0 3 \0 1 \0 | \0 
0000040 H \0 B \0 | \0 3 \0 9 \0 | \0 P \0 h \0 
0000060 | \0 4 \0 9 \0 \r \n \0 \r \n \0 3 \0 2 \0 
0000100 | \0 F \0 B \0 | \0 3 \0 8 \0 | \0 P \0 
0000120 h \0 | \0 5 \0 9 \0 \r \n \0 \r \n \0 
0000136
让我们从头开始

你注意到前两个字节了吗?八进制377和376。别名0xFF 0xFE十六进制。这就是所谓的字节顺序标记(BOM)。它用于向必须读取文件的应用程序“传递”信息(编码和结束)

现在,如果BOM为0xFF 0xFE,则表示该文件包含编码为UTF-16的Unicode字符。确切地说,它是一个小的Endian UTF-16编码文件(UTF-16LE)

由于您的文件编码为UTF-16LE。。。每个字符都需要两个字节:

  • 第一个字符(拉丁文大写字母A)由“A\0”表示
  • 第二个字符是“|\0”
  • 第三个字符是“B\0”
  • 等等
到目前为止。。。这么好。问题是“\r\n”。如果文件编码为UTF-8,则此序列将是通常的CR LF,但BOM显示文件编码为UTF-16LE,因此

  • 回车应该用0x0D 0x00表示(在od-c中为\r\0)
  • 0x0A 0x00(\n\0在od-c中)的新行
您使用“\r\n”而不是“\r\0\n\0”这一事实会使不知道如何使用UTF-16LE编码“解释”这些字节的应用程序感到困惑。UTF-16LE中的序列“\r\n”无效,应用程序使用两个“框”来表示这些无效字节

简而言之:您的文件编码错误(一半是UTF-16LE,一半是UTF-8)。我猜有人用记事本或类似的东西来改变它的内容


您可以尝试使用iconv和/或sed来修复它。

您必须了解文件的确切内容。我建议您在Unix上运行以下命令:
od-c您的_文件
以获得八进制转储。@mauro。。你好我已经检查了这个命令,并且理解了这个问题。问题在于在unix中将LF转换为CRLF。你能帮我做一下必要的命令吗?非常感谢你的帮助help@BapuAbhi:我不相信你在谷歌上没有找到任何关于LFCRLF转换搜索的信息。@MatteoItalia尝试了很多链接。。但是还没有成功。。直到我开始工作。你介意分享一下
od-c
的输出吗?我怀疑CR和LF都会导致你们在输出中看到的那个盒子。无论如何您可以使用以下sed命令删除每行末尾的额外CR:
sed的/\x0D$/'old\u file>new\u file
您必须了解文件确切包含的内容。我建议您在Unix上运行以下命令:
od-c您的_文件
以获得八进制转储。@mauro。。你好我已经检查了这个命令,并且理解了这个问题。问题在于在unix中将LF转换为CRLF。你能帮我做一下必要的命令吗?非常感谢你的帮助help@BapuAbhi:我不相信你在谷歌上没有找到任何关于LFCRLF转换搜索的信息。@MatteoItalia尝试了很多链接。。但是还没有成功。。直到我开始工作。你介意分享一下
od-c
的输出吗?我怀疑CR和LF都会导致你们在输出中看到的那个盒子。无论如何您可以使用以下sed命令来删除每行末尾的额外CR:
sed的/\x0D$/'旧\u文件>新\u文件
@Mauro…感谢您的回复。但我得到的是pgp加密格式的文件。我已解密该文件并共享该文件的内容。我知道问题在LF。它应该是CRLF,这样我的BPEL文件适配器就可以读取和处理。。。当我在记事本++中手动复制内容时,CRLF将显示在文件中。我已使用以下命令删除\0和|\0 CMD->u2dos()(set-f;IFS='';printf'%s\r\n'$(cat“$1”))u2dos oldfile.txt>newfile.txt