2011-06-03 137 views

回答

7

如果你需要這個寫.properties文件,您可以只添加絃樂入Properties對象,然後將其保存到一個文件中。它會照顧轉換。

+0

那麼你需要確保你保存UTF-8格式的文件(也許UTF-16或UCS-2/4可以工作),否則你將會遇到問題 – ArtB 2011-06-03 17:18:38

+7

@ArtB:不,屬性總是將輸入文件解釋爲ISO-8859-1(第一個Unicode頁),並保存到該編碼中,這就是爲什麼它需要'\ uXXXX'轉義並在保存時創建它們。版本1.6屬性允許讀取來自Reader對象的輸入,以便您可以製作屬於自己的基於UTF-8的專有屬性文件格式。 – x4u 2011-06-03 17:26:55

+0

Oh ...這不會導致非首頁頁面語言的問題嗎? – ArtB 2011-06-03 17:50:17

20

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

+0

哪種方法做到這一點? – ehsun7b 2011-06-03 17:09:17

+0

更新了答案。 – sorin 2011-06-03 17:14:52

+7

看來這個方法已經改名['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版本 – 2013-06-24 23:19:00

11

有三個部分答案

  1. 獲取的Unicode的每個字符
  2. 確定它是否是西里爾頁
  3. 轉換爲十六進制。

要獲取每個字符,您可以使用charAt()toCharArray()方法遍歷字符串。

for(char c : s.toCharArray()) 

char的值是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和扭轉ifelse機構;你或許應該逃避一切,是不是ASCII。我在閱讀你的問題時可能太過於字面意思。

+0

這是我的背景下的正確答案。 但是,我相信「getCharArray()」應該是「toCharArray」。 – 2014-02-10 10:26:05

+0

@JenS。實際上,這個方法實際上是['toCharArray()'](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toCharArray())。 – ArtB 2014-02-10 19:53:00

+0

這對所有的Unicode字符都不正確!例如對於德語'Ä',它返回'\ uC4',而不是'\ u00c4'。 – mik01aj 2014-12-08 13:13:20

7

有一個命令行工具,隨Java稱爲native2ascii。這將unicode文件轉換爲ASCII轉義文件。我發現這是爲本地化生成.properties文件的必要步驟。

14

我也有這個問題。我曾與一些特殊字符一些葡萄牙文,但這些字符在那裏已經以Unicode格式(例如:\u00e3)。

所以我想將S\u00e3o轉換爲São

我是用apache commons StringEscapeUtils做的。正如@ sorin-sbarnea所說。可以下載here

使用方法unescapeJava,像這樣:

String text = "S\u00e3o" 
text = StringEscapeUtils.unescapeJava(text); 
System.out.println("text " + text); 

(也有方法escapeJava,但是這一次放Unicode字符的字符串中。)

如果有人知道純Java的解決方案,請告訴我們。

+0

你是這樣做的,這不是OP要求的。 – mik01aj 2014-12-08 13:49:24

+0

m01是對的,很高興你回答這樣,雖然 – Danielson 2015-10-08 13:06:29

42

存在經由命令行如下執行的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"); 

然後讀取新文件的內容。

+3

你可以做到這一點,而無需啓動子進程,請參閱http://stackoverflow.com/a/6017769/115493 – mik01aj 2014-12-08 13:47:35

+0

這[gist](https://gist.github.com/ulisseslima/d614a31b73947471e04176b0951527bd)將上面的命令行示例封裝在Bash腳本中,因此使用起來更加簡單。 – dvlcube 2017-07-31 17:58:18

13

這裏是ArtB's answer的改進版本:

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代碼點。

+0

它是否適用於多字節字符,例如當一行中的4-6-8個字節(2,3,4個java ** char **值)僅代表一個符號? – radistao 2017-06-12 12:50:01

0

你也許可以破解如果從這個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 - Yet Another JavaScript Unicode Encode/Decode

3

阿帕奇百科全書StringEscapeUtils.escapeEcmaScript(String)返回Unicode字符使用\u符號轉義的字符串。

"Art of Beer " -> "Art of Beer \u1F3A8 \u1F37A" 
0

只是對於一些基本的方法(從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); 
    } 
} 
相關問題