【问题标题】:Character Encoding interferes with matching Scala strings?字符编码会干扰匹配的 Scala 字符串?
【发布时间】:2013-02-14 18:32:39
【问题描述】:

现在在尝试匹配两个 Scala 字符串时处理一个奇怪的问题。当试图确定以下两个字符串是否相同时:

SM8lz5IEIWs7TUhR3ke27pnY3XsjojxqaMEg+ARCGs1nm3sVkwA+CM+XJfdsUxqzqH7LZdkflvny z621tYkmXA==SM8lz5IEIWs7TUhR3ke27pnY3XsjojxqaMEg+ARCGs1nm3sVkwA+CM+XJfdsUxqzqH7LZdkflvny z621tYkmXA==

Scala 返回false。因此,如果我执行以下操作 if(hash1 == hash2) 它会返回 false

我怀疑这是空格或字符编码问题,因为哈希匹配仅在尝试匹配在不同操作系统的计算机上生成的哈希时才会失败。我已经尝试使用正则表达式去除空格,但仍然失败。

我忽略了什么?在 Scala 中是否有更好的方法来清理和匹配哈希?

更新

比较两个字符串后,Scala 认为hash2 是比hash1 长的单个字符。所以我在两个哈希上运行了以下函数:.trim.replaceAll("""(?m)\s+$""", "")。不过,它说它们不一样。还有哪些其他角色可能会干扰?

【问题讨论】:

  • 我已经在 osx 10.8 上尝试过,并且哈希值与“true”相比。您可以尝试运行 hash1.diff(hash2) 以查看是否存在一些实际差异(它应该产生不匹配的符号)。
  • 刚刚意识到 Scala 认为一个字符比另一个长。将发布更新。
  • 尝试打印以下内容(s1s2 是您的两个字符串):s1.zip(s2).zipWithIndex.find{ case ((c1, c2), i) => c1 != c2 }。这将告诉您它们在什么索引处开始分歧,以及两个不同的字符是什么。这应该有助于查明问题。

标签: string scala character-encoding pattern-matching


【解决方案1】:

我已经找到了这个特定问题的原因。显然,在 Macintosh 上处理字符串时,除了任何换行符之外,还会添加 \r。即使换行符不会在控制台上打印出来,它们仍然在字符串中。

补救措施是执行以下操作:.trim.replaceAll("\r", "")

现在两个字符串都匹配了。

【讨论】:

  • 您不想在比较之前正确解码它们吗?
  • 我最初是使用原始字节生成一个新的UTF-8 字符串。但您是否建议走得更远?
  • 我认为您的示例中的乱码不是实际数据,而是某种编码(引用 printable 或 base64 等),尽管我不认识确切的格式。是这样吗?
  • 它是密码和盐之间的哈希值。但是,然后我通过从哈希中获取字节然后生成类似new String(hash.getBytes, "UTF-8") 的东西来重新处理它,结果相同。这能解释清楚吗?
  • 是的。但是,如果这些字节是任意 8 位值,那么您将面临无法编码为 UTF-8 字符的真正风险。如果它们“仅仅是”字节(不是编码字符),那么您不应该尝试将它们视为Char。基本上,你所拥有的是不是String,你不应该假装它是。
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多