\u
国際的な(ロシア語などの)文字列を数値(Unicode番号など)
に変換するにはどうすればよい\u041e\u041a
ですOK
か?
12 に答える
次のようにコマンドラインから実行される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");
次に、新しいファイルの内容を読み取ります。
escapeJavaStyleString
から使用できますorg.apache.commons.lang.StringEscapeUtils
。
私もこの問題を抱えていました。いくつかの特殊文字を含むポルトガル語のテキストがありましたが、これらの文字はすでにUnicode形式になっています(例:) \u00e3
。
S\u00e3o
だから私はに変換したいと思いSão
ます。
私はapachecommonsStringEscapeUtilsを使用してそれを行いました。@sorin-sbarneaが言ったように。ここからダウンロードできます。
unescapeJava
次のような方法を使用します。
String text = "S\u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);
(メソッドもありますがescapeJava
、これはユニコード文字を文字列に入れます。)
純粋な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コードポイントに対して正しく機能しますÄ
。
答えには3つの部分があります
- 各文字のUnicodeを取得します
- キリル文字ページにあるかどうかを確認します
- 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();
編集:おそらくチェックを行い、と本文c < 128
を逆にする必要があります。おそらくASCII以外のすべてをエスケープする必要があります。あなたの質問を読んだとき、私はおそらく文字通りすぎたでしょう。if
else
native2asciiと呼ばれるJavaに付属するコマンドラインツールがあります。これにより、UnicodeファイルがASCIIエスケープファイルに変換されます。これは、ローカリゼーション用の.propertiesファイルを生成するために必要な手順であることがわかりました。
ファイルを書き込むためにこれが必要な場合は.properties
、文字列をプロパティオブジェクトに追加して、ファイルに保存するだけです。変換は面倒を見てくれます。
Apache commonsは、表記法StringEscapeUtils.escapeEcmaScript(String)
を使用してエスケープされたUnicode文字を含む文字列を返します。\u
"Art of Beer " -> "Art of Beer \u1F3A8 \u1F37A"
文字列をユニコードシーケンスに、またはその逆に変換するユーティリティを備えたオープンソースのJavaライブラリMgntUtilsがあります。
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
ライブラリはMavenCentralまたはGithubにあります。Mavenアーティファクトとして提供され、ソースとjavadocが付属しています。
StringUnicodeEncoderDecoderクラスのjavadocは次のとおりです。
そのためのいくつかの基本的なメソッド(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);
}
}
この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;
}
このタイプ名はDecode/UnescapeUnicodeです。このサイトはオンラインコンバーターにリンクしています。