在java中将国际string转换为\ u代码
如何将国际(如俄罗斯)string转换为\u
数字(unicode数字)
OK
?
如果你需要这样写一个.properties
文件,你可以将string添加到一个Properties对象中,然后将其保存到一个文件中。 它会照顾转换。
有一个通过命令行执行的JDK工具 ,如下所示:
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");
然后阅读新文件的内容。
你可以使用org.apache.commons.lang.StringEscapeUtils
escapeJavaStyleString
。
我也有这个问题。 我有一些葡萄牙语的文字和一些特殊的字符,但这些字符已经以unicode格式(例如: \u00e3
)。
所以我想把S\u00e3o
。
我做了使用Apache Commons StringEscapeUtils 。 正如@ sorin-sbarnea所说。 可以在这里下载。
使用方法unescapeJava
,像这样:
String text = "S\u00e3o" text = StringEscapeUtils.unescapeJava(text); System.out.println("text " + text);
(还有escapeJava
方法,但是这个把unicode字符放在string中。)
如果有人知道纯Java的解决scheme,请告诉我们。
以下是ArtB答案的改进版本:
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码点。
答案有三个部分
- 获取每个字符的Unicode
- 确定它是否在西里尔页
- 转换为hex。
要获取每个字符,可以使用charAt()
或toCharArray()
方法遍历string。
for( char c : s.toCharArray() )
char的值是Unicode值。
西里尔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
并扭转if
和else
机构; 你可能应该逃避一切不是ASCII的。 我在阅读你的问题时可能太直接了。
有一个叫做native2ascii的 java命令行工具。 这将unicode文件转换为ASCII转义文件。 我发现这是为本地化生成.properties文件的必要步骤。
Apache Commons StringEscapeUtils.escapeEcmaScript(String)
返回一个string,其中包含使用\u
表示法转义的unicode字符。
"Art of Beer 🎨 🍺" -> "Art of Beer \u1F3A8 \u1F37A"
你可能可以从这个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 – 另一个JavaScript Unicode编码/解码