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

问题描述:

如何将国际(例如俄语)字符串转换为\u(unicode编号)
\u041e\u041aOK将国际字符串转换为 u在java中的代码

如果你需要这个写.properties文件,您可以只添加弦乐入Properties对象,然后将其保存到一个文件中。它会照顾转换。

+0

那么你需要确保你保存UTF-8格式的文件(也许UTF-16或UCS-2/4可以工作),否则你将会遇到问题 – ArtB 2011-06-03 17:18:38

+7

@ArtB:不,属性总是将输入文件解释为ISO-8859-1(第一个Unicode页),并保存到该编码中,这就是为什么它需要'\ uXXXX'转义并在保存时创建它们。版本1.6属性允许读取来自Reader对象的输入,以便您可以制作属于自己的基于UTF-8的专有属性文件格式。 – x4u 2011-06-03 17:26:55

+0

Oh ...这不会导致非首页页面语言的问题吗? – ArtB 2011-06-03 17:50:17

你可以使用escapeJavaStyleStringorg.apache.commons.lang.StringEscapeUtils

+0

哪种方法做到这一点? – ehsun7b 2011-06-03 17:09:17

+0

更新了答案。 – sorin 2011-06-03 17:14:52

+7

看来这个方法已经改名['escapeJava'](http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html#escapeJava% 28java.lang.String%29)在3.x版本 – 2013-06-24 23:19:00

有三个部分答案

  1. 获取的Unicode的每个字符
  2. 确定它是否是西里尔页
  3. 转换为十六进制。

要获取每个字符,您可以使用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。我在阅读你的问题时可能太过于字面意思。

+0

这是我的背景下的正确答案。 但是,我相信“getCharArray()”应该是“toCharArray”。 – 2014-02-10 10:26:05

+0

@JenS。实际上,这个方法实际上是['toCharArray()'](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toCharArray())。 – ArtB 2014-02-10 19:53:00

+0

这对所有的Unicode字符都不正确!例如对于德语'Ä',它返回'\ uC4',而不是'\ u00c4'。 – mik01aj 2014-12-08 13:13:20

有一个命令行工具,随Java称为native2ascii。这将unicode文件转换为ASCII转义文件。我发现这是为本地化生成.properties文件的必要步骤。

我也有这个问题。我曾与一些特殊字符一些葡萄牙文,但这些字符在那里已经以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的解决方案,请告诉我们。

+0

你是这样做的,这不是OP要求的。 – mik01aj 2014-12-08 13:49:24

+0

m01是对的,很高兴你回答这样,虽然 – Danielson 2015-10-08 13:06:29

存在经由命令行如下执行的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"); 

然后读取新文件的内容。

+3

你可以做到这一点,而无需启动子进程,请参阅http://stackoverflow.com/a/6017769/115493 – mik01aj 2014-12-08 13:47:35

+0

这[gist](https://gist.github.com/ulisseslima/d614a31b73947471e04176b0951527bd)将上面的命令行示例封装在Bash脚本中,因此使用起来更加简单。 – dvlcube 2017-07-31 17:58:18

这里是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代码点。

+0

它是否适用于多字节字符,例如当一行中的4-6-8个字节(2,3,4个java ** char **值)仅代表一个符号? – radistao 2017-06-12 12:50:01

你也许可以破解如果从这个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

阿帕奇百科全书StringEscapeUtils.escapeEcmaScript(String)返回Unicode字符使用\u符号转义的字符串。

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

只是对于一些基本的方法(从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); 
    } 
}