Java 将UTF-8 Unicode字符串转换为ASCII Unicode转义字符串
我需要将unicode字符串转换为使用unicode编码的非ascii字符的字符串。例如,字符串“漢字 “最大值”应表示为“\u6F22\u5B57最大值” 我所尝试的:Java 将UTF-8 Unicode字符串转换为ASCII Unicode转义字符串,java,string,unicode,utf-8,ascii,Java,String,Unicode,Utf 8,Ascii,我需要将unicode字符串转换为使用unicode编码的非ascii字符的字符串。例如,字符串“漢字 “最大值”应表示为“\u6F22\u5B57最大值” 我所尝试的: 不同组合的 新字符串(sourceString.getBytes(编码1),编码2) ApacheStringEscapeutils也可以转义ascii字符,如双引号 StringEscapeUtils.escapeJava(来源) 有没有一种简单的方法来编码这样的字符串?理想情况下,只能使用Java 6 SE或Apache
有没有一种简单的方法来编码这样的字符串?理想情况下,只能使用Java 6 SE或Apache Commons来实现所需的结果。这是Jon Skeet在其评论中想到的简单代码:
final String in = "šđčćasdf";
final StringBuilder out = new StringBuilder();
for (int i = 0; i < in.length(); i++) {
final char ch = in.charAt(i);
if (ch <= 127) out.append(ch);
else out.append("\\u").append(String.format("%04x", (int)ch));
}
System.out.println(out.toString());
final String in=“šđčćasdf”;
最终StringBuilder out=新StringBuilder();
对于(int i=0;i
import static java.lang.String.format;
import com.google.common.escape.CharEscaper;
public class NonAsciiUnicodeEscaper extends CharEscaper
{
@Override
protected char[] escape(final char c)
{
if (c >= 32 && c <= 127) { return new char[]{c}; }
else { return format("\\u%04x", (int) c).toCharArray(); }
}
}
导入静态java.lang.String.format;
导入com.google.common.escape.CharEscaper;
公共类NonAsciiUnicodeEscaper扩展了CharEscaper
{
@凌驾
受保护字符[]转义(最终字符c)
{
如果(c>=32&&c)有任何理由不自己实现它吗?这不会花费很长时间。这对性能有多重要?您需要担心代理项对吗?(您是否愿意将它们编码为一对\u
转义序列?)使用正确的术语可以提高您找到解决方案的机会:您想要的不是Unicode编码;它使用Java特定的Unicode转义形式。@Jon Skeet,我只是不想再发明轮子。我从答案中了解到这是多么容易。有多种字符串文字格式使用\u
转义,但可以处理诸如代理项和ASCII转义的方式不同。如果您只生成用户可读的文本,可能您不在乎,“任何使用\u
的旧格式”这已经足够好了,但是如果您正在创建JSON,您需要使用JSON转义的确切规则。这正是我的第一个想法,但这取决于上下文——有时您实际上希望换行保持换行。请注意,由于反斜杠不会转义,因此此编码方案不明确,并且不会往返。例如,对于输入<代码>é\u00E9
输出为\u00E9\u00E9
@bobince我不会称之为不明确,因为在这个系统下é和\u00E9
是同义词。bug:feature::不明确:同义词。如果你需要从转义表单中知道原始数据,那么bug,如果你不在乎,那么feature:-)@无论如何,这不是这段代码的错:这是Java指定的。往返字符串文本对于Java来说当然不是目标。