0

我在解析包含非法字符(二进制标记)的文本文件时遇到问题。答案如下:

测试.csv

^000000^id1,text1,text2,text3

这里^000000^是源文件中非法字符的文本表示。

我正在考虑在处理之前使用 java.nio 来验证该行。所以,我正在考虑引入一个 Validator trait,如下所示:

import java.nio.charset._
trait Validator{
   private def encoder = Charset.forName("UTF-8").newEncoder
   def isValidEncoding(line:String):Boolean = {
     encoder.canEncode(line)
   }
}

你们认为这是处理这种情况的正确方法吗?

谢谢

4

2 回答 2

2

二进制数据不是字符串。不要试图破解在转换为String.

如果您的输入是任意字节序列(即使其中许多符合 ASCII),甚至不要尝试将其转换为String.

于 2013-04-05T19:40:24.960 回答
2

当你已经有了一个String,UTF-8 总是可以编码任何字符串*时为时已晚。您需要转到最初解码文件的位置。


ISO-8859-1 是一种具有有趣属性的编码:

  • 从字面上看,任何字节序列都是有效的 ISO-8859-1
  • 每个解码字符的代码点与解码它的字节的值完全相同

因此,您可以将文件解码为 ISO-8859-1 并去掉非英文字符:

//Pseudo code
str = file.decode("ISO-8859-1");
str = str.replace( "[\u0000-\u0019\u007F-\u00FF]", "");

您还可以逐行迭代,并忽略包含 中的字符的每一行[\u0000-\u0019\u007F-\u00FF],如果这就是您在处理之前验证行的意思。


我还想到二进制标记可能是 BOM。您可以使用十六进制编辑器查看这些值。

*除了那些有非法代理人的人,这可能不是这里的情况。

于 2013-04-06T09:47:31.940 回答