如何在Java中将UTF-8转换为unicode?

时间:2013-09-04 06:06:13

标签: java unicode utf-8

例如,在表情符号字符集中,U+1F601是“GRINNING FACE WITH SMILING EYES”的unicode值,\xF0\x9F\x98\x81是该字符的UTF-8字节值。

\xE2\x9D\xA4用于沉重的黑心,unicode为U+2764

所以我的问题是,如果我有一个值为(0xF0, 0x9F, 0x98, 0x81, 0xE2, 0x9D, 0xA4)的字节数组,那么我如何将其转换为Unicode值?

对于上面的结果,我想要的是一个值为"1F601""2764"的String数组。

我知道我可以编写一个复杂的方法来完成这项工作,但我希望已经有一个库来完成这项工作。

4 个答案:

答案 0 :(得分:8)

  

所以我的问题是,如果我有一个带有值的字节数组(0xF0,0x9F,0x98,0x81),那么我如何将其转换为Unicode值呢?

只需调用指定数据和编码的String构造函数:

String text = new String(bytes, "UTF-8");

您可以指定Charset而不是编码名称 - 我喜欢Guava的简单Charsets类,它允许您编写:

String text = new String(bytes, Charsets.UTF_8);

或者对于Java 7,使用StandardCharsets甚至不需要Guava:

String text = new String(bytes, StandardCharsets.UTF_8);

答案 1 :(得分:1)

只需使用String类:

byte[] bytesArray = new byte[10]; // array of bytes (0xF0, 0x9F, 0x98, 0x81)

String string = new String(bytesArray, Charset.forName("UTF-8")); // covert byteArray

System.out.println(string); // Test result

答案 2 :(得分:0)

以下是使用InputStreamReader的示例:

InputStream inputStream = new FileInputStream("utf-8-text.txt");
Reader      reader      = new InputStreamReader(inputStream,
                                                Charset.forName("UTF-8"));

int data = reader.read();
while(data != -1){
    char theChar = (char) data;
    data = reader.read();
}

reader.close();

价:Java I18N example

答案 3 :(得分:0)

这是将UNICODE(ISO_8859_1)转换为UTF-8的功能

public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
  final char ch = strISO_8859_1.charAt(i);
  if (ch <= 127) 
  {
      stringBuilder.append(ch);
  }
  else 
  {
      stringBuilder.append(String.format("%02x", (int)ch));
  }
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
    data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                         + Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}

测试

String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);

System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));

结果

  

ISO_8859_1策略=اÙغÙاÙString_ISO_8859_1To_UTF_8 =الغلاف