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

ehs*_*n7b 45 java unicode escaping unicode-escapes

我如何转换的国际(如俄罗斯)字符串到\u数字(Unicode数字),
\u041e\u041aOK

Abd*_*UMI 52

有一个JDK工具通过命令行执行如下:

native2ascii -encoding utf8 src.txt output.txt
Run Code Online (Sandbox Code Playgroud)

示例:

src.txt

??? ???? ?????? ??????
Run Code Online (Sandbox Code Playgroud)

output.txt的

\u0628\u0633\u0645 \u0627\u0644\u0644\u0647 \u0627\u0644\u0631\u062d\u0645\u0646 \u0627\u0644\u0631\u062d\u064a\u0645
Run Code Online (Sandbox Code Playgroud)

如果要在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");
Run Code Online (Sandbox Code Playgroud)

然后阅读新文件的内容.

  • 您可以在不启动子进程的情况下执行此操作,请参阅http://stackoverflow.com/a/6017769/115493 (4认同)

sor*_*rin 23

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

  • 看来这个方法已被重命名为[`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版本中 (7认同)
  • 该方法也逃脱了其他特殊符号,例如.引用(").这可能是一种不受欢迎的行为. (5认同)

Der*_*rzu 16

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

所以我想转换S\u00e3oSão.

我使用apache commons StringEscapeUtils做到了.正如@ sorin-sbarnea所说.可以在这里下载.

使用方法unescapeJava,如下所示:

String text = "S\u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);
Run Code Online (Sandbox Code Playgroud)

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

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


mik*_*1aj 15

这是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();
Run Code Online (Sandbox Code Playgroud)

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


Sle*_*led 12

答案有三个部分

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

要获取每个字符,您可以使用charAt()toCharArray()方法遍历String .

for( char c : s.toCharArray() )
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

如果它在这个范围内,那就是西里尔文.只需执行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();
Run Code Online (Sandbox Code Playgroud)

编辑:可能应该检查c < 128并反转ifelse身体; 你可能应该逃避非ASCII的一切.在阅读你的问题时,我可能过于文字了.


x4u*_*x4u 8

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

  • @ArtB:不,Properties将输入文件始终解释为`ISO-8859-1`(第一个unicode页面),并保存到该编码.这就是为什么它需要`\ uXXXX`转义并在保存时创建它们.虽然Java版本1.6属性允许从Reader对象读取输入,因此您可以创建自己的基于UTF-8的专有属性文件格式. (7认同)
  • 这就是我将*写入Java VM一般支持的扩展*的原因.实际上它支持BMP之外的字符,因为Java将这些字符视为代理对,因此它们也可以在\ u对中编码.但是,对代理的支持程度在Java中变化很大,从大多数不存在到XML-Parsers或某些Swing组件的某些支持.此外,java.lang中的许多基本String操作例程现在似乎都是代理人知道的(据我所知除了regexp),但如果你愿意,你仍然可以在它们中间剪切一个字符串. (4认同)

Sam*_*num 7

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


小智 5

Apache commons StringEscapeUtils.escapeEcmaScript(String)返回一个字符串,其中包含使用该\u符号转义的unicode字符。

"Art of Beer  " -> "Art of Beer \u1F3A8 \u1F37A"
Run Code Online (Sandbox Code Playgroud)