如何使用Java获取字符串的编码版本(例如\ u0421 \ u043b \ u0443 \ u0435 \ u0435 \ u0435 \ u0443 \ u0430 \ u044f)?
编辑: 我想问题不是很清楚......基本上我想要的是这个:
给定字符串 s =“blalbla”我想得到字符串“\ uXXX \ uYYYY”
答案 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
:
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");
对我来说就像一个魅力:
Служебная