我有一个 CSV,我想检查它是否包含应有的所有数据。但看起来 ZWNBSP 出现在第一个字符串中第一个列名称的开头。
我的简化代码是
@Test
void parseCsvTest() throws Exception {
Configuration.holdBrowserOpen = true;
ClassLoader classLoader = getClass().getClassLoader();
try (
InputStream inputStream = classLoader.getResourceAsStream("files/csv_example.csv");
CSVReader reader = new CSVReader(new InputStreamReader(inputStream))
) {
List<String[]> content = reader.readAll();
var csvStrings0line = content.get(0);
var csv1stElement = csvStrings0line[0];
var csv1stElementShouldBe = "Timestamp";
assertEquals(csv1stElementShouldBe,csv1stElement);
我的 CSV 包含
"Timestamp","Source","EventName","CountryId","Platform","AppVersion","DeviceType","OsVersion"
"2022-05-02T14:56:59.536987Z","courierapp","order_delivered_sent","643","ios","3.11.0","iPhone 11","15.4.1"
"2022-05-02T14:57:35.849328Z","courierapp","order_delivered_sent","643","ios","3.11.0","iPhone 8","15.3.1"
我的测试失败了
expected: <Timestamp> but was: <Timestamp>
Expected :Timestamp
Actual :Timestamp
<Click to see difference>
点击查看差异显示实际文本的开头有一个 ZWNBSP。
将我的文本复制粘贴到在线工具中以显示不可打印的 unicode 字符https://www.soscisurvey.de/tools/view-chars.php仅在行尾显示 CR LF,没有 ZWNBSP。
但是它从哪里来?
这是一个 BOM 字符。您可以自行删除它或使用其他几种解决方案(例如,请参阅https://stackoverflow.com/a/4897993/1420794)
那是 Unicode 零宽度不间断空格字符。当在 Unicode 编码文本文件的开头使用时,它充当“字节顺序标记”。您可以阅读它来确定文本文件的编码,然后您可以根据需要安全地丢弃它。您能做的最好的事情就是传播意识。
自 SmarterCSV 1.8.0 版本以来,BOM 字符问题已得到修复
要查看文件的十六进制转储,此命令可以帮助调试此类问题:
hexdump -C your-file.csv