将国际字符串转换为java中的\ u代码

时间:2011-06-03 16:56:01

标签: java unicode escaping unicode-escapes

如何将国际(例如俄语)字符串转换为\u个数字(unicode数字)
例如\u041e\u041a的{​​{1}}?

12 个答案:

答案 0 :(得分:50)

通过命令行执行JDK tools如下:

native2ascii -encoding utf8 src.txt output.txt

示例:

<强> src.txt

بسم الله الرحمن الرحيم

output.txt

\u0628\u0633\u0645 \u0627\u0644\u0644\u0647 \u0627\u0644\u0631\u062d\u0645\u0646 \u0627\u0644\u0631\u062d\u064a\u0645

如果要在Java应用程序中使用它,可以通过以下方式包装此命令行:

String pathSrc = "./tmp/src.txt";
String pathOut = "./tmp/output.txt";
String cmdLine = "native2ascii -encoding utf8 " + new File(pathSrc).getAbsolutePath() + " " + new File(pathOut).getAbsolutePath();
Runtime.getRuntime().exec(cmdLine);
System.out.println("THE END");

然后阅读新文件的内容。

答案 1 :(得分:22)

您可以使用escapeJavaStyleString中的org.apache.commons.lang.StringEscapeUtils

答案 2 :(得分:14)

我也有这个问题。我有一些带有一些特殊字符的葡萄牙语文本,但这些字符已经是unicode格式(例如:\u00e3)。

所以我想将S\u00e3o转换为São

我是使用apache commons StringEscapeUtils完成的。正如@ sorin-sbarnea所说。可以下载here

使用方法unescapeJava,如下所示:

String text = "S\u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);

(还有方法escapeJava,但是这个方法将unicode字符放在字符串中。)

如果有人知道纯Java的解决方案,请告诉我们。

答案 3 :(得分:14)

以下是ArtB's answer的改进版本:

    StringBuilder b = new StringBuilder();

    for (char c : input.toCharArray()) {
        if (c >= 128)
            b.append("\\u").append(String.format("%04X", (int) c));
        else
            b.append(c);
    }

    return b.toString();

此版本转义所有非ASCII字符,并且对于Ä等低Unicode代码点正常工作。

答案 4 :(得分:11)

答案分为三部分

  1. 获取每个字符的Unicode
  2. 确定它是否在西里尔文页面
  3. 转换为十六进制。
  4. 要获取每个字符,您可以使用charAt()toCharArray()方法遍历字符串。

    for( char c : s.toCharArray() )
    

    char的值是Unicode值。

    Cyrillic Unicode个字符是以下范围内的任何字符:

    Cyrillic:            U+0400–U+04FF ( 1024 -  1279)
    Cyrillic Supplement: U+0500–U+052F ( 1280 -  1327)
    Cyrillic Extended-A: U+2DE0–U+2DFF (11744 - 11775)
    Cyrillic Extended-B: U+A640–U+A69F (42560 - 42655)
    

    如果它在这个范围内,那就是西里尔文。只需执行if检查。如果它在范围内,请使用Integer.toHexString()并添加"\\u"。放在一起应该看起来像这样:

    final int[][] ranges = new int[][]{ 
            {  1024,  1279 }, 
            {  1280,  1327 }, 
            { 11744, 11775 }, 
            { 42560, 42655 },
        };
    StringBuilder b = new StringBuilder();
    
    for( char c : s.toCharArray() ){
        int[] insideRange = null;
        for( int[] range : ranges ){
            if( range[0] <= c && c <= range[1] ){
                insideRange = range;
                break;
            }
        }
    
        if( insideRange != null ){
            b.append( "\\u" ).append( Integer.toHexString(c) );
        }else{
            b.append( c );
        }
    }
    
    return b.toString();
    

    修改:可能应该检查c < 128并反转ifelse机构;你可能应该逃避非ASCII的一切。在阅读你的问题时,我可能过于文字了。

答案 5 :(得分:8)

如果您需要编写.properties文件,只需将字符串添加到Properties对象中,然后将其保存到文件中即可。它会照顾转换。

答案 6 :(得分:7)

有一个名为native2ascii的java附带的命令行工具。这会将unicode文件转换为ASCII转义文件。我发现这是生成.properties文件以进行本地化的必要步骤。

答案 7 :(得分:4)

Apache commons StringEscapeUtils.escapeEcmaScript(String)返回一个字符串,其中使用\u表示法转义了unicode字符。

"Art of Beer  " -> "Art of Beer \u1F3A8 \u1F37A"

答案 8 :(得分:1)

有一个开源Java库MgntUtils,它具有一个实用程序,可以将字符串转换为unicode序列,反之亦然:

result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

此代码的输出是:

\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World

可以在Maven CentralGithub处找到该库,它是Maven工件,并带有源代码和Javadoc

这里是类StringUnicodeEncoderDecoder的javadoc

答案 9 :(得分:0)

你可能会破解这个JavaScript代码:

/* convert  to \uD83D\uDE4C */
function text_to_unicode(string) {
  'use strict';

  function is_whitespace(c) { return 9 === c || 10 === c || 13 === c || 32 === c;  }
  function left_pad(string) { return Array(4).concat(string).join('0').slice(-1 * Math.max(4, string.length)); }

  string = string.split('').map(function(c){ return "\\u" + left_pad(c.charCodeAt(0).toString(16).toUpperCase()); }).join('');

  return string;
}


/* convert \uD83D\uDE4C to  */
function unicode_to_text(string) {
  var  prefix = "\\\\u"
     , regex  = new RegExp(prefix + "([\da-f]{4})","ig")
     ; 

  string = string.replace(regex, function(match, backtrace1){
    return String.fromCharCode( parseInt(backtrace1, 16) )
  });

  return string;
}

来源:iCompile - Yet Another JavaScript Unicode Encode/Decode

答案 10 :(得分:0)

只是一些基本的方法(灵感来自native2ascii工具):

/**
 * Encode a String like äöü to \u00e4\u00f6\u00fc
 * 
 * @param text
 * @return
 */
public String native2ascii(String text) {
    if (text == null)
        return text;
    StringBuilder sb = new StringBuilder();
    for (char ch : text.toCharArray()) {
        sb.append(native2ascii(ch));
    }
    return sb.toString();
}

/**
 * Encode a Character like ä to \u00e4
 * 
 * @param ch
 * @return
 */
public String native2ascii(char ch) {
    if (ch > '\u007f') {
        StringBuilder sb = new StringBuilder();
        // write \udddd
        sb.append("\\u");
        StringBuffer hex = new StringBuffer(Integer.toHexString(ch));
        hex.reverse();
        int length = 4 - hex.length();
        for (int j = 0; j < length; j++) {
            hex.append('0');
        }
        for (int j = 0; j < 4; j++) {
            sb.append(hex.charAt(3 - j));
        }
        return sb.toString();
    } else {
        return Character.toString(ch);
    }
}

答案 11 :(得分:0)

此类型名称为Decode / Unescape Unicode。 这个site link在线转换器。