web-dev-qa-db-ja.com

javaで国際文字列を\ uコードに変換する

国際(ロシア語など)文字列を\u番号(ユニコード番号)に変換するにはどうすればよいですか
例えば。 \u041e\u041a for OK

45
ehsun7b

.propertiesファイルを書き込むためにこれが必要な場合は、文字列をPropertiesオブジェクトに追加して、ファイルに保存するだけです。変換に注意します。

8
x4u

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

次に、新しいファイルの内容を読み取ります。

50
Abdennour TOUMI

org.Apache.commons.lang.StringEscapeUtilsからescapeJavaStyleStringを使用できます。

22
sorin

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コードポイントに対して正常に動作します。

15
mik01aj

私もこの問題を抱えていました。いくつかの特殊文字を含むポルトガル語のテキストがいくつかありましたが、これらの文字はすでに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文字を入れます。)

Pure Javaのソリューションを知っている人がいたら教えてください。

15
Derzu

答えには3つの部分があります

  1. 各文字のUnicodeを取得します
  2. キリル文字ページにあるかどうかを判別
  3. 16進数に変換します。

各文字を取得するには、 charAt() または toCharArray() メソッドを使用して文字列を反復処理できます。

_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();
_

Edit:はおそらくチェック_c < 128_を行い、ifelse本体を逆にする必要があります。あなたはおそらくASCII以外のすべてをエスケープすべきです。私はあなたの質問を読んだときにおそらく文字通りすぎました。

12
Tobogganski

Java native2ascii と呼ばれるコマンドラインツールがあります。これは、UnicodeファイルをASCIIエスケープファイルに変換します。これが必要なステップであることがわかりましたローカライズ用の.propertiesファイルの生成。

7
Sam Barnum

Apache commons StringEscapeUtils.escapeEcmaScript(String)は、\u表記を使用してエスケープされたUnicode文字を含む文字列を返します。

"Art of Beer ???? ????" -> "Art of Beer \u1F3A8 \u1F37A"
4
davidofmorris

Open Source 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

ライブラリは Maven Central または Github にあります。Mavenアーティファクトとして、ソースとjavadocが付属しています

クラスのjavadocは次のとおりです StringUnicodeEncoderDecoder

1
Michael Gantman

この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-もう1つのJavaScript Unicodeエンコード/デコード

0
user257319

そのためのいくつかの基本的な方法(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);
    }
}
0
larsilus