【问题标题】:ZWNBSP appears when parsing CSV解析CSV时出现ZWNBSP
【发布时间】:2023-02-16 13:52:51
【问题描述】:

我有一个 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>

点击see difference可以看到在Actual文本的开头有一个ZWNBSP。

将我的文本复制粘贴到用于显示不可打印的 unicode 字符的在线工具 https://www.soscisurvey.de/tools/view-chars.php 仅在行尾显示 CR LF,没有 ZWNBSP。

但它从何而来?

【问题讨论】:

  • 改为使用十六进制编辑器打开它。该字符很可能在文件中(或者您是否建议有一种机制可以无缘无故地插入随机字符?),并且当您在线复制它时它会被删除(仅依靠在线工具是个坏主意)。

标签: java csv junit special-characters


【解决方案1】:

这是一个 BOM 字符。您可以自己删除它或使用其他几种解决方案(例如,请参阅https://stackoverflow.com/a/4897993/1420794

【讨论】:

    【解决方案2】:

    那是 Unicode 零宽度不间断空格字符。当用在 Unicode 编码文本文件的开头时,它用作“字节顺序标记”。您读取它以确定文本文件的编码,然后您可以根据需要安全地丢弃它。你能做的最好的事情就是传播意识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多