0

我的项目需要将阿拉伯语文本转换为二进制,然后将二进制转换为文本(反向过程)。我使用了这段代码,但我注意到当我使用 utf-16 将字符串转换为二进制时,然后读取此二进制以将其转换回原始 UTF-16 字符串会给我不同的字符

例如:编码中使用的阿拉伯字符是 (ن),它通过 utf-16lE 转换为二进制 (0100011000000110)

现在,当我想将这些二进制位(0100011000000110)转换为原始 utf-16 字符串时,会给我不同的字符是 F。

如果字符串是阿拉伯字符和 utf-16 编码,就会出现这些问题。我该如何解决这个问题..?

// Convert the text to binary
public static String getBinaryFromText(String secretText) {
    byte[] bytes = secretText.getBytes(StandardCharsets.UTF_16LE);
    StringBuilder binary = new StringBuilder();
    for (byte b : bytes) {
        int val = b;
        for (int i = 0; i < 8; i++) {
            binary.append((val & 128) == 0 ? 0 : 1);
            val <<= 1;
        }
    }

    return binary.toString();
}

// Convert the binary to text.
public static String getTextFromBinary(String binaryString) {
    String binary = binaryString.replace(" ", "");
    String binaryPer8Bits;
    byte[] byteData;
    byteData = new byte[binary.length() / 8];

    for (int i = 0; i < binary.length() / 8; i++) {
        // To divide the string into 8 characters
        binaryPer8Bits = binary.substring(i * 8, (i + 1) * 8);
        // The integer of decimal string of binary numbers
        Integer integer = Integer.parseInt(binaryPer8Bits, 2);
        // The casting to a byte type variable
        byteData[i] = integer.byteValue();
    }

    return new String(byteData);
}
4

1 回答 1

5

用默认编码new String(byteData);解释创建。byte[]要将其解释为 UTF_16LE,您需要使用不同的构造函数:

new String(byteData, StandardCharsets.UTF_16LE);

(几乎)永远不要使用new String(byte[])它将使用默认编码,因此您的应用程序将依赖于平台。

于 2019-09-08T18:20:58.563 回答