Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将UTF-8 Unicode字符串转换为ASCII Unicode转义字符串_Java_String_Unicode_Utf 8_Ascii - Fatal编程技术网

Java 将UTF-8 Unicode字符串转换为ASCII Unicode转义字符串

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

我需要将unicode字符串转换为使用unicode编码的非ascii字符的字符串。例如,字符串“漢字 “最大值”应表示为“\u6F22\u5B57最大值”

我所尝试的:

  • 不同组合的

    新字符串(sourceString.getBytes(编码1),编码2)

  • ApacheStringEscapeutils也可以转义ascii字符,如双引号

    StringEscapeUtils.escapeJava(来源)


  • 有没有一种简单的方法来编码这样的字符串?理想情况下,只能使用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来说当然不是目标。