Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中将国际字符串转换为\u代码_Java_Unicode_Escaping_Unicode Escapes - Fatal编程技术网

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

在java中将国际字符串转换为\u代码,java,unicode,escaping,unicode-escapes,Java,Unicode,Escaping,Unicode Escapes,如何将国际(如俄语)字符串转换为\u数字(unicode数字) e、 g.\u041e\u041a对于OK?您可以使用org.apache.commons.lang.StringEscapeUtils中的escapeJavaStyleString来编写.properties文件,您只需将字符串添加到属性对象中,然后将其保存到文件中即可。它将负责转换。答案有三个部分 获取每个字符的Unicode 确定它是否在西里尔文页面中 转换为十六进制 要获取每个字符,可以使用or方法遍历字符串 char的值是

如何将国际(如俄语)字符串转换为
\u
数字(unicode数字)

e、 g.
\u041e\u041a
对于
OK

您可以使用
org.apache.commons.lang.StringEscapeUtils

中的
escapeJavaStyleString
来编写
.properties
文件,您只需将字符串添加到属性对象中,然后将其保存到文件中即可。它将负责转换。

答案有三个部分

  • 获取每个字符的Unicode
  • 确定它是否在西里尔文页面中
  • 转换为十六进制
  • 要获取每个字符,可以使用or方法遍历字符串

    char的值是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();
    
    String text = "S\u00e3o"
    text = StringEscapeUtils.unescapeJava(text);
    System.out.println("text " + text);
    
    final int[][]范围=新int[][]{
    {  1024,  1279 }, 
    {  1280,  1327 }, 
    { 11744, 11775 }, 
    { 42560, 42655 },
    };
    StringBuilder b=新的StringBuilder();
    for(char c:s.toCharArray()){
    int[]insideRange=null;
    for(int[]范围:范围){
    
    如果(范围[0]java附带了一个名为的命令行工具。它将unicode文件转换为ASCII转义文件。我发现这是生成用于本地化的.properties文件的必要步骤。

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

    所以我想把
    S\u00e3o
    转换成
    São

    我是用ApacheCommons做的。正如@sorin sbarnea所说的。可以下载

    使用方法
    unescapeJava
    ,如下所示:

    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();
    
    String text = "S\u00e3o"
    text = StringEscapeUtils.unescapeJava(text);
    System.out.println("text " + text);
    
    (也有方法
    escapeJava
    ,但此方法将unicode字符放入字符串中。)

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

    有一个通过命令行执行的解决方案,如下所示:

    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");
    

    然后阅读新文件的内容。

    以下是改进版:


    此版本将转义所有非ASCII字符,并可正确用于低Unicode代码点,如
    Ä

    ,如果您使用此JavaScript代码:

    /* convert Apache commons 
    StringEscapeUtils.escapeEcmaScript(String)
    returns a string with unicode characters escaped using the
    \u
    notation.

    "Art of Beer Just some basic Methods for that (inspired from native2ascii tool):

    /**
     * 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);
        }
    }
    

    /*convertapachecommons
    StringEscapeUtils.escapeEcmaScript(String)
    返回使用
    \u
    符号转义的unicode字符字符串

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

    “啤酒艺术”只是一些基本的方法(灵感来源于native2ascii工具):

    /**
    *将类似äöü的字符串编码为\u00e4\u00f6\u00fc
    * 
    *@param text
    *@返回
    */
    公共字符串native2ascii(字符串文本){
    if(text==null)
    返回文本;
    StringBuilder sb=新的StringBuilder();
    for(char ch:text.toCharArray()){
    某人附加(本地2科学(ch));
    }
    使某人返回字符串();
    }
    /**
    *对像äto\u00e4这样的字符进行编码
    * 
    *@param-ch
    *@返回
    */
    公共字符串native2ascii(char-ch){
    如果(ch>'\u007f'){
    StringBuilder sb=新的StringBuilder();
    //写入\udddd
    某人加上“\\u”);
    StringBuffer十六进制=新的StringBuffer(Integer.tohextString(ch));
    十六进制反转();
    int length=4-十六进制长度();
    对于(int j=0;j
    有一个开源java库MgntUtils,它有一个实用程序,可以将字符串转换为unicode序列,反之亦然:

    此代码的输出为:

    该库可以在或处找到,它作为maven工件提供,并带有源代码和javadoc


    下面是类的javadoc

    此类型名称为Decode/Unescape Unicode。
    此联机转换器。

    您需要确保以UTF-8格式保存文件(也许UTF-16或UCS-2/4可以工作),否则会出现问题。@ArtB:否,属性总是将输入文件解释为
    ISO-8859-1
    (第一个unicode页面)这就是为什么它需要
    \uxxx
    转义并在保存时创建它们的原因。尽管Java 1.6版属性允许从读卡器对象读取输入,以便您能够创建自己专有的基于UTF-8的属性文件格式。哦…这不会导致非第一页l出现问题吗语言?是的,对于大多数使用8859-1以外字符的语言,它会产生相对较大的文件,因为
    \uxxx
    编码比UTF-8或UTF-16节省空间。这也使得在任何不知道这种特殊编码的编辑器中都无法编辑这些文件。但至少它允许保存和加载所有文件l unicode文本到Java VM通常支持的扩展。这就是为什么我写到Java VM通常支持的扩展。实际上它支持BMP之外的字符,因为Java将这些字符视为代理项对,因此它们也可以编码为\u对。但是代理项的支持级别不同在Java中有很多,从基本上不存在到XML解析器或一些Swing组件支持。Java.lang中的许多基本字符串操作例程到现在似乎都知道代理(据我所知,regexp除外)但是如果你喜欢的话,你仍然可以在他们中间剪一个字符串。看起来这个方法已经在3。x版本中被重命名了。
    \u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
    Hello World