# Hex 2 char



## Guest (22. Jan 2008)

Hallo,

habe mal eine Frage. Und zwar möchte ich gerne einen StringBuffer nach Sonderzeichen überprüfen und wenn solch einer existiert durch das Hex-Wert ersetzen: Zum Beispiel das Ohm-Zeichen (Ω) durch "\u03A9". Das Auffinden und ersetzen funktioniert, aber leider nicht wieder zurück. Geht es nur über den Weg, wenn ich den zurückgelieferten StringBuffer nach "\u03A9" suche? Oder gibt es die Möglichkeit der automatischen Ersetzung? 

Hat wer eine Idee? Hier mal der relevante Codingteil.


```
public String getNeu(StringBuffer sb) {

   StringBuffer neu = new StringBuffer();

   if (sb != null) {
      for (int i = 0; i < sb.length(); i++){
         if ((int)sb.charAt(i) > 255)  {
            char c = sb.charAt(i);
            String hex = Integer.toHexString((int)c);

            // Ich denke hier ist der Knackpunkt?!?
            neu.append("\\u" + hex);
         } else {
            neu.append(sb.charAt(i));
         }
      }
   }
}
```


----------



## Chloroplast (1. Feb 2012)

wie oder ob es mit einem stringbuffer geht weiss ich nicht. Aber  _.replace()_ geht bei einem String wunderbar. in deinem fall wäre es dann etwa so: 
	
	
	
	





```
String neu = "trololo, \u03A9 ist ein OMEGA zeichen...";
neu = neu.replace("\u03A9","Ω")
System.out.println(neu);
```
Ausgegeben werden würde:
trololo, Ω ist ein OMEGA zeichen...


----------



## xehpuk (2. Feb 2012)

Na, ob das den Gast nach vier Jahren noch interessiert? 
Dein 
	
	
	
	





```
replace()
```
 kannst du übrigens gleich weglassen, da 
	
	
	
	





```
"\u03A9" == "Ω"
```
. Bei dir fehlt ein Backslash.

Ich habe da mal etwas zusammengebastelt:

```
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TransformUnicodes {
	public static final char MAX_CODE_POINT = 0xFF;
	public static final int HEX_BASE = 0x10;
	public static final int UNICODE_WIDTH = 4;
	public static final String UNICODE_PREFIX = "\\u";
	public static final String HEX_DIGIT_PATTERN = "\\p{XDigit}";
	
	public static void main(final String[] args) {
		final String initial = "0 Ω – Widerstand zwecklos. ☺";
		final String replaced = replaceUnicodes(initial);
		final String inserted = insertUnicodes(replaced);
		System.out.println(initial);
		System.out.println(replaced);
		System.out.println(inserted);
	}
	
	public static String replaceUnicodes(final String s) {
		final StringBuilder sb = new StringBuilder();
		for (int i = 0; i < s.length(); i++) {
			final char c = s.charAt(i);
			if (c <= MAX_CODE_POINT) {
				sb.append(c);
			} else {
				sb.append(UNICODE_PREFIX);
				final String hex = Integer.toHexString(c).toUpperCase(Locale.ENGLISH);
				for (int j = hex.length(); j < UNICODE_WIDTH; j++) {
					sb.append(0);
				}
				sb.append(hex);
			}
		}
		return sb.toString();
	}
	
	public static String insertUnicodes(final String s) {
		final StringBuffer sb = new StringBuffer();
		final Pattern p = Pattern.compile(Pattern.quote(UNICODE_PREFIX) + HEX_DIGIT_PATTERN + "{" + UNICODE_WIDTH + "}");
		final Matcher m = p.matcher(s);
		while (m.find()) {
			final char c = (char) Integer.parseInt(m.group().substring(UNICODE_PREFIX.length()), HEX_BASE);
			if (c > MAX_CODE_POINT) {
				m.appendReplacement(sb, Matcher.quoteReplacement(String.valueOf(c)));
			}
		}
		m.appendTail(sb);
		return sb.toString();
	}
}
```


```
0 Ω – Widerstand zwecklos. ☺
0 \u03A9 \u2013 Widerstand zwecklos. \u263A
0 Ω – Widerstand zwecklos. ☺
```


----------

