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

时间:2016-02-15 15:26:13

标签: unix bpel

当我打开它时,我有一个看起来像这样的文件Notepad ++

         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

< http://i.stack.imgur.com/Rc8B8.png>

先谢谢,

阿布舍克巴克

1 个答案:

答案 0 :(得分:0)

当您在此文件上运行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字符。确切地说,它是Little 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 \ n)
  • 表示
  • 新行0x0A 0x00(od -c中的\ n \ 0)

你有“\ r \ n”而不是“\ r \ 0 \ n \ 0”的事实会混淆那些不知道如何使用UTF-16LE编码“解释”这些字节的应用程序。 UTF-16LE中的序列“\ r \ n”无效,应用程序使用两个“框”来表示这些无效字节。

要保持简短:您的文件编码错误(一半UTF-16LE和一半UTF-8)。我猜有人确实使用记事本或类似的东西来改变其内容。

您可以尝试使用iconv和/或sed进行修复。