如何将国际化字符串(例如俄语)转换为 \u
数字 (unicode 数字)?
例如,将字符串 OK
转换为 \u041e\u041a
?
如何将国际化字符串(例如俄语)转换为 \u
数字 (unicode 数字)?
例如,将字符串 OK
转换为 \u041e\u041a
?
有一个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
转换成 São
。
我使用了apache commons的StringEscapeUtils,就像@sorin-sbarnea所说的那样。可以在这里下载。
使用unescapeJava
方法,如下:
String text = "S\u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);
(还有一个方法叫做escapeJava
,但是它会把unicode字符放入字符串中。)
如果有人知道一个纯Java的解决方案,请告诉我们。
这是 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码点,如Ä
。
回答分为三部分:
要获取每个字符,可以使用 charAt()
或 toCharArray()
方法迭代字符串。
for( char c : s.toCharArray() )
该字符的值是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
并颠倒 if
和 else
的主体;你们可能需要转义所有非ASCII字符。在阅读您的问题时,我可能太过字面了。
Ä
,它返回\uC4
而不是\u00c4
。 - mik01aj.properties
文件,只需将字符串添加到 Properties 对象中,然后将其保存到文件中即可。它会自动进行转换。ISO-8859-1
(第一个Unicode页面),并且也保存到该编码中。这就是为什么它需要\uXXXX
转义并在保存时创建它们的原因。虽然自Java版本1.6起,Properties允许从Reader对象中读取输入,因此您可以创建自己专有的基于UTF-8的属性文件格式。 - x4u\uXXXX
编码产生的文件相对较大,因为其空间利用率不如UTF-8或UTF-16。它还使得在任何不知道这种特殊编码的编辑器中都无法编辑这些文件。但至少它允许保存和加载所有Unicode文本,只要Java VM通常支持这种程度。 - x4uApache Commons的StringEscapeUtils.escapeEcmaScript(String)
方法可以将字符串中的Unicode字符使用\u
符号进行转义。
"Art of Beer " -> "Art of Beer \u1F3A8 \u1F37A"
有一个开源的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
仅需几个基本步骤:
/**
* 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);
}
}
native2ascii
已经消失了,现在有什么替代方案呢? - Martynas Jusevičius