从 Java 中的字节解码韩语字符串

Decode Korean String from Bytes in Java

我 运行 在 Java 中努力转换字节数组韩文字符。 维基百科指出每个字符以某种方式使用 3 个字节,但并未考虑所有位。

有没有一种简单的方法可以转换这种非常特殊的...格式?我不想编写循环和计数器来跟踪位和字节,因为它会变得混乱,而且我无法想象没有简单的解决方案。原生 java 库将是完美的,或者也许有人想出了一些智能位移逻辑。

更新 2: 下面的 @DavidConrad 发布了一个可行的解决方案,我假设它是 UTF-8 编码是错误的。

更新:

这些字节

[91, -80, -8, -69, -25, 93, 32, -64, -78, -80, -18, -73, -50]

应该输出这个:

[공사] 율곡로

但是使用

new String(shortStrBytes,"UTF8"); // or
new String(shortStrBytes,StandardCharsets.UTF_8);

将它们变成这样:

[����] �����
The returned string has 50% more chars

你应该使用 StandardCharsets.UTF_8。 从 String 转换为 byte[],反之亦然:

import java.util.*;
import java.nio.charset.StandardCharsets;

public class Translater {

    public static String translateBytesToString(byte[] b) {
      return new String(b, StandardCharsets.UTF_8);
    }

    public static byte[] translateStringToBytes(String s) {
      return s.getBytes(StandardCharsets.UTF_8);
    }

    public static void main(String[] args) {
        final String STRING = "[공사] 율곡로";
        final byte[] BYTES = {91, -22, -77, -75, -20, -126, -84, 93, 32, -20, -100, -88, -22, -77, -95, -21, -95, -100};
    
        String s = translateBytesToString(BYTES);
        byte[] b = translateStringToBytes(STRING);
    
        System.out.println("String: " + translateBytesToString(BYTES));
        System.out.print("Bytes: ");
        for (int i=0; i<b.length; i++)
           System.out.print(b[i] + " ");
    }
}

自从您将字节添加到问题后,我做了一些研究和一些试验,我相信您的文本编码为 EUC-KR。在将它们解释为该编码时,我得到了预期的韩文字符。

// convert bytes to a Java String
byte[] data = {91, -80, -8, -69, -25, 93, 32, -64, -78, -80, -18, -73, -50};
String str = new String(data, "EUC-KR");

// now convert String to UTF-8 bytes
byte[] utf8 = str.getBytes(StandardCharsets.UTF_8);
System.out.println(HexFormat.ofDelimiter(" ").formatHex(utf8));

这将打印以下十六进制值:

5b ea b3 b5 ec 82 ac 5d 20 ec 9c a8 ea b3 a1 eb a1 9c

哪些是这些韩文字符的正确 UTF-8 编码,并且使用支持它们的终端,打印字符串也应该正确显示它们。