【问题标题】:2 Java Strings in different encoding?2 不同编码的Java字符串?
【发布时间】:2017-03-31 21:36:29
【问题描述】:

我有问题。我认为 Java 字符串总是编码为 UTF-16?现在我有一个带有文本“TEST”的文件,它使用 UTF-8 编码并带有 BOM。当我使用 Files.newBufferedReader(test_file) 从文件中读取数据时,它会给我一个带有 UTF-8 和 BOM 编码的字符串。

try (BufferedReader reader = Files.newBufferedReader( test_file )){
    reader.lines().forEach( 
        s -> {
            System.out.println( Arrays.toString( s.getBytes() ) );
            System.out.println( Arrays.toString( "TEST".getBytes()) );
            System.out.println( s.equals("TEST") );
        } );
} catch( Exception e ) {}

我在这里没有指定任何编码。但奇怪的是,输出是这样的:

[-17, -69, -65, 84, 69, 83, 84]
[84, 69, 83, 84]
false

这怎么可能?看起来我在 Java 中有两个不同编码的字符串...

问题是,我需要“s”作为HashMap<String, String> 的键。但关键是“TEST”,s.equals("TEST") 返回 false,因此当我尝试 mymap.get(s) 时,HashMap 返回 null。

【问题讨论】:

  • s.getBytes() 使用未指定的平台默认编码,可以是 UTF-8、ASCII 或 任何东西。 调用String.getBytes() 真的不是 100% 好主意没有争论。但实际上,打印出s。 (s 可以有隐形字符吗?坦率地说,它看起来可能。)

标签: java string file-io encoding utf-8


【解决方案1】:

问题在于 BufferedReader 正在读取您的 BOM。序列-17, -69, -65 只是UTF-8 的BOM。但是文字 "Test" 不包含 BOM,因此字符串不相等。

【讨论】:

  • 但是 s 和 "TEST" 都是 Java 字符串。怎么可能有 2 个不同编码的 Java 字符串?
  • 您必须手动跳过 BOM,因为 BufferedReader 正在读取文件包含的内容并且文件包含 BOM。两个 Java 字符串都具有相同的编码。但只有一个包含 BOM。
  • 天哪,我明白了。很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2018-07-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2016-10-25
相关资源
最近更新 更多