Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中比较具有不同字节顺序掩码的字符串_Java_Encoding - Fatal编程技术网

在Java中比较具有不同字节顺序掩码的字符串

在Java中比较具有不同字节顺序掩码的字符串,java,encoding,Java,Encoding,在我的Java程序中,我有两个字符串s1和s2,但是当它们打印出来时,它们看起来都是相等的,因为它们的编码不同s1。equals(s2)返回false。我如何比较这两个字符串,以便即使它们的编码不同,它们仍然相等 请看以下示例代码: s1 = s1.trim(); s2 = s2.trim(); byte[] s1bytes = s1.getBytes(); byte[] s2bytes = s2.getBytes(); System.out.printl

在我的Java程序中,我有两个字符串
s1
s2
,但是当它们打印出来时,它们看起来都是相等的,因为它们的编码不同
s1。equals(s2)
返回false。我如何比较这两个字符串,以便即使它们的编码不同,它们仍然相等

请看以下示例代码:

    s1 = s1.trim();
    s2 = s2.trim();
    byte[] s1bytes = s1.getBytes();
    byte[] s2bytes = s2.getBytes();
    System.out.println(s1+","+s2+","+s1.equals(s2));

    System.out.println("\ns1's bytes are:");
    for (int i = 0; i < s1bytes.length; i++) {
        System.out.println(s1bytes[i]);
    }

    System.out.println("\ns2's bytes are:");
    for (int i = 0; i < s2bytes.length; i++) {
        System.out.println(s2bytes[i]);
    }
正如您所看到的,当打印的
s1
s2
看起来相同时,当进行比较时,它们不相等,并且它们的字节数组都不同


编辑:我的问题不同于,因为我没有从文件中读取数据,.java文件中的源代码编码不同于其他文件中的数据。

从文件中读取字符串时,从字符串中删除字节顺序掩码(BOM)。此文件的字符代码为
”\格式控制符"

印刷品:

SHEOGMIOF
SHEOGMIOF
true

问题中的样本实际上在编码上没有差异,但在字节顺序标记的存在/不存在上有所不同

下面的类演示了当字节序列确实表示不同的字符串编码时如何处理这种情况。在示例代码中,编码必须是已知的。请注意,通常仅从字节序列推断编码是一项非常重要的任务

//  https://stackoverflow.com/questions/229015/encoding-conversion-in-java
//

import java.lang.*;
import java.io.*;
import java.nio.*;

public class encotest {
    public static void main(String[] args) {
        // German lowercase umlauted vowels (äöü) as octet sequences in 2 different encodings
        byte[]  raw_iso8859_15  = { (byte) 0xE4, (byte) 0xF6, (byte) 0xFC };
        byte[]  raw_utf8        = { (byte) 0xC3, (byte) 0xA4, (byte) 0xC3, (byte) 0xB6, (byte) 0xC3, (byte) 0xBC };

        try {
            String s_umlauts_from_iso   = new String(raw_iso8859_15 , "ISO-8859-15");
            String s_umlauts_from_utf8  = new String(raw_utf8       , "UTF-8");

            if (s_umlauts_from_iso.equals(s_umlauts_from_utf8)) {
                System.out.println("They are the same !");
            }
            else {
                System.out.println("They differ!");
            }
        } catch (UnsupportedEncodingException uee) {
            System.out.println("Error: cannot convert");
        }
    }
}
预期产出:

They are the same !

“编码方式不同”是什么意思?Java字符串总是用UCS-2编码。编码是指它们写入磁盘或任何其他类型的“字节数组”时的表示形式“。我猜您的字符串有一些空白或其他不可见字符,使它们在屏幕上看起来相同,但实际上不同。”。尝试将每个字符的值打印为整数,然后查看差异所在。例如,俄语也有字母a、o、c和其他一些字母,可能您的一些字母使用的是不同的语言。@Silvio Mayolo我编辑了我的文章,以包含一个示例。这不是编码问题吗?如果不让我知道,我会更改标题。这可能是一个解码问题,在从外部表示到
字符串的步骤中。字符串本身没有不同的编码。@flakes您是对的,在答案中添加了预期的程序输出。非常感谢。
//  https://stackoverflow.com/questions/229015/encoding-conversion-in-java
//

import java.lang.*;
import java.io.*;
import java.nio.*;

public class encotest {
    public static void main(String[] args) {
        // German lowercase umlauted vowels (äöü) as octet sequences in 2 different encodings
        byte[]  raw_iso8859_15  = { (byte) 0xE4, (byte) 0xF6, (byte) 0xFC };
        byte[]  raw_utf8        = { (byte) 0xC3, (byte) 0xA4, (byte) 0xC3, (byte) 0xB6, (byte) 0xC3, (byte) 0xBC };

        try {
            String s_umlauts_from_iso   = new String(raw_iso8859_15 , "ISO-8859-15");
            String s_umlauts_from_utf8  = new String(raw_utf8       , "UTF-8");

            if (s_umlauts_from_iso.equals(s_umlauts_from_utf8)) {
                System.out.println("They are the same !");
            }
            else {
                System.out.println("They differ!");
            }
        } catch (UnsupportedEncodingException uee) {
            System.out.println("Error: cannot convert");
        }
    }
}
They are the same !