如何获取字符串的编码版本(例如\ u0421 \ u043b \ u0443 \ u0436 \ u0435 \ u0431 \ u043d \ u0430 \ u044f)

时间:2011-08-04 10:12:44

标签: java encoding utf-8

如何使用Java获取字符串的编码版本(例如\ u0421 \ u043b \ u0443 \ u0435 \ u0435 \ u0435 \ u0443 \ u0430 \ u044f)?

编辑: 我想问题不是很清楚......基本上我想要的是这个:

给定字符串 s =“blalbla”我想得到字符串“\ uXXX \ uYYYY”

5 个答案:

答案 0 :(得分:2)

您需要从字符串中提取每个代码点/单元并自行编码。以下适用于所有字符串,即使字符串中的各个语言字符由有向图或连字组成。

public String getUnicodeEscapes(String aString)
{
    if (aString != null && aString.length() > 0)
    {
        int length = aString.length();
        StringBuilder buffer = new StringBuilder(length);
        for (int ctr = 0; ctr < length; ctr++)
        {
            char codeUnit = aString.charAt(ctr);
            String hexString = Integer.toHexString(codeUnit);
            String padAmount = "0000".substring(hexString.length());
            buffer.append("\\u");
            buffer.append(padAmount);
            buffer.append(hexString);
        }
        return buffer.toString();
    }
    else
    {
        return null;
    }
}

上面根据Unicode escapes上的Java语言规范生成输出,即它为每个UTF-16 代码单元生成\uxxxx形式的输出。它通过生成一对代表\uxxxx\uyyyy的代码单元来解决补充字符。

最初发布的代码已被修改为以U+FFFFF

格式生成Unicode代码点
public String getUnicodeCodepoints(String aString)
{
    if (aString != null && aString.length() > 0)
    {
        int length = aString.length();
        StringBuilder buffer = new StringBuilder(length);
        for (int ctr = 0; ctr < length; ctr++)
        {
            char ch = aString.charAt(ctr);
            if (Character.isLowSurrogate(ch))
            {
                continue;
            }
            else
            {
                int codePoint = aString.codePointAt(ctr);
                String hexString = Integer.toHexString(codePoint);
                String zeroPad = Character.isHighSurrogate(ch) ? "00000" : "0000";
                String padAmount = zeroPad.substring(hexString.length());
                buffer.append(" U+");
                buffer.append(padAmount);
                buffer.append(hexString);
            }
        }
        return buffer.toString();
    }
    else
    {
        return null;
    }
}

gruntwork由String.codePointAt()方法完成,该方法在特定索引处返回Unicode代码点。对于由组合字符组成的String实例,String实例的长度不是可见字符数的长度,而是实际Unicode代码点的数量。例如,组合在梵文中形成क्,上述函数将正确地返回U+0915 U+094d而不会有任何麻烦,因为String.length()将返回2组合字符。具有增补字符的字符串将使用单个代码点作为单个字符 - (页面将无法正确显示此字符串文字,但您可以将其复制得很好;它应该是Javascript但是使用Mathematical alphanumeric symbols)的补充字符集将返回U+1d4a5 U+1d4b6 U+1d4cb U+1d4b6 U+1d4c8 U+1d4b8 U+1d4c7 U+1d4be U+1d4c5 U+1d4c9

答案 1 :(得分:1)

public static void main(String[] args) {
    Charset charset = Charset.forName("UTF-8");
    CharsetDecoder decoder = charset.newDecoder();
    CharsetEncoder encoder = charset.newEncoder();

    try {
      ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f"));

      CharBuffer cbuf = decoder.decode(bbuf);
      String s = cbuf.toString();
      System.out.println(s);
    } catch (CharacterCodingException e) {
      e.printStackTrace();
    }
  }

答案 2 :(得分:1)

我不知道内置解决方案,所以:

StringBuilder builder = new StringBuilder();
for(int i=0; i<yourString.length(); i++) {
    builder.append(String.format("\\u%04x", yourString.charAt(i)));
}
String encoded = builder.toString();

编辑:sry,我以为你想把String编码为\ uXXXX表达式......

答案 3 :(得分:0)

你没有说过你的编码是什么,但根据标签,我假设你想要UTF-8编码。方法如下:

byte[] utf8 = 
    "\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f".getBytes("UTF-8");

然后,您可以编写一个简单的循环,以十六进制或十进制的形式输出utf8中的字节...或者用它们做其他事情。

答案 4 :(得分:0)

System.out.println ("\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f");

对我来说就像一个魅力:

Служебная