# Anderer Zeichensatz für String



## The_S (26. Feb 2005)

Hi, wie kann ich einen String in einen anderen Zeichensatz konvertieren?


----------



## Bleiglanz (26. Feb 2005)

gar nicht, weil Java Strings "intern" keinen Zeichensatz HABEN

schau in die java.io.*, fast alle Reader/Writer Klassen haben einen Zusatzparameter im Konstruktor für das Charset

bzw. gibt es für String einen Kontruktor um aus einem byte[] + Charset einen String zu machen

und ebenso in java.lang.String eine Methode 
byte[]	getBytes(String charsetName)


----------



## The_S (27. Feb 2005)

Heißt das praktisch, dass ich mir abschminken kann in einem JTextArea einen Text in einem anderen Zeichensatz auszugeben?


----------



## Bleiglanz (27. Feb 2005)

nein, heisst es nicht: der Text (String) wird gar nicht in einem "Zeichensatz" ausgegeben, er hat gar keinen!

was du meinst ist wahrscheinlich der "Font" - und für welche Unicodezeichen der Font ein darstellbares Symbol bereithält (das ist eine ganz andere Frage)


----------



## The_S (27. Feb 2005)

Pass auf, ich habe folgenden Code um in einem anderen Zeichensatz eine Datei zu schreiben:


```
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(new FileOutputStream("C:\\test.txt"), "Cp850"));
```

Aber das hätte ich jetzt gerne nicht in einer Textdatei ausgegeben sondern in einem JTextArea. Natrülich könnte ich die Datei wieder einlesen, aber das wäre doch sehr Performancelastig.


----------



## Bleiglanz (27. Feb 2005)

Ja wie liegt der Inhalt den vor? Was schreibst du in diese Datei???

Wenn du eh schon einen String hat ist doch nix zu tun???


----------



## The_S (27. Feb 2005)

```
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(new FileOutputStream("C:\\test.txt"), "Cp850"));
String sonderzeichen = "29 3r5ß ä-#a. .asd käa#fal #,#ä a #";
bw.write(sonderzeichen);
bw.close();
```

Ich will das ganze aber nicht in C:\test.txt speichern sondern in nem JTextArea.


----------



## Roar (27. Feb 2005)

textarea.setTex(sonderzeichen) ??


----------



## The_S (27. Feb 2005)

Roar hat gesagt.:
			
		

> textarea.setTex(sonderzeichen) ??


Nö, ich will z. B. den String "Das ist kein MS-Dos Text denn ä, ö und ü werden Beispielsweise richtig dargestellt" in einen anderen Zeichensatz formatieren z. B. "Das ist MS-Dos Text, denn manche Zeichen werden nicht richtig dargestellt" und den anderen Zeichensatz dann ausgeben


----------



## Stefan1200 (27. Feb 2005)

Naja, du kannst dein Programm auf ein anderes Charset einstellen, mit dem Befehl:



> java -Dfile.encoding=Cp850 -jar Blah.jar



Obs hilft, keine Ahnung.


----------



## Stefan1200 (27. Feb 2005)

Aber woher bekommst du denn den MSDos Text?
Falls du diesen aus einer Datei einliest, kannst du auch bei einem InputStream das Charset einstellen.


----------



## Bleiglanz (28. Feb 2005)

```
String s = "Das ist kein MS-Dos Text denn ä, ö und ü werden Beispielsweise richtig dargestellt" ;

String t = "Das ist MS-Dos Text, denn manche Zeichen werden nicht richtig dargestellt";
```

erstens: t ist nicht s in einem anderen Zeichensatz!?!

zweitens: s hat keinen Zeichensatz

drittens: wenn du System.out.print(s) machst, dann funzt das möglicherweise nicht, weil die Konsole bescheuerte fonts verwendet

viertens: s ist ein String, in dem nichts besonderes ist

fünstens: wenn der code so wie oben im quelltext steht, dann musst auf deinem Sytem für den java-Compiler etc. auf das Encoding des Java Quelltexts achten (ansonsten \u1234 verwenden)


----------



## thE_29 (28. Feb 2005)

<ot>http://www.jforum.de/showthread.php?t=986&highlight=Hobbit_im_Blutrausch
Doppelposting  Man sollte net unbedingt mit einem Forum Werbung machen, indem man das gleiceh fragt! </ot>


----------



## The_S (28. Feb 2005)

@thE_29 
Sorry, aber wenn man mir dort nicht helfen kann versuch ichs halt hier! In www.javacore.de ist die Frage auch. Ich würde aber natürlich überall die Lösung posten, sofern eine gefunden wird. Also wo ist das Problem?

@Bleiglanz
- Ich weiß auch das t nicht s in einem anderen Zeichensatz ist! Sollte nur ein schnell dahingeschriebenes Beispiel sein um mein Problem zu verdeutlichen
- s hat keinen Zeichensatz? Check ich net
- Ich mach kein System.out.println
- in s steht ä, ö, ü. Nicht jeder Zeichensatz kommt damit klar
- nein, steht nicht so im Code. Weitere Erläuterung, siehe 1. Antwort

@Stefan1200
Der User gibt den Text ein.

Hat niemand eine Idee?


----------



## Stefan1200 (28. Feb 2005)

Aber wenn der User den Text eingibt, ist doch der Text in Unicode, oder nicht? Oder evtl. in dem Charset, in dem das Programm läuft. Wieso gibt es dann Probleme mit Sonderzeichen? Was machst du denn mit dem String? Wo gibt der User den Text ein? Konsole? Gui?


----------



## thE_29 (28. Feb 2005)

<ot> es ist halt nur bisi Provokant ne andere javaforum seite in der Sig zu haben und dann die gleichen Fragen mehrmals stellen;> </ot>


----------



## The_S (28. Feb 2005)

User gibt den Text in ner GUI ein. Der Text soll später wieder in einem anderen Zeichensatz angezeigt werden.


----------



## dotlens (28. Feb 2005)

du hast einen Zeichensatz wenn der User den Text eingibt (Font des JLabels oder was auch immer).
Wenn du das ganze in nem String speicherst besitzt er allerdings diese font nicht mehr.
Wenn du diesen String dann wieder darstellen willst mit einem anderen Zeichensatz musst du einfach die Font der entsprechenden Komptonente (z.b JLabel) ändern.


----------



## The_S (28. Feb 2005)

*heul* Zeichensatz (charset), nicht Font!


----------



## Bleiglanz (28. Feb 2005)

Am besten du befasst dich mal etwas mit

Font
Charset
Unicode
Java-Strings

und versuchst dann, dein Problem genauer zu schildern


----------



## The_S (28. Feb 2005)

Bleiglanz hat gesagt.:
			
		

> und versuchst dann, dein Problem genauer zu schildern



Was ist daran so schwer zu verstehen? Ich will doch einfach nur von einem Zeichensatz in einen anderen Zeichensatz umwandeln. Die Zeichen, welche in dem neuen Zeichensatz nicht mehr vorhanden sind, sollen durch die dazugehörigen Zeichen des neuen Zeichensatzes ersetzt werden. Zum besseren Verständnis ein Beispiel wo sowas nützlich ist: Ein Javaprogramm soll eine Batch-Datei schreiben, welche ein Programm in einem Verzeichnis öffnet. Sobald jetzt aber ein ä oder ähnliches im Verzeichnisnamen vorkommt habe ich ein Problem, deshalb muss ich den String vorher in den MS-DOS Zeichensatz umwandeln. Ich weiß, dass ich das in diesem Fall mit einem OutputStreamWriter lösen kann, aber wenn ich die Datei vorher ausgeben will (in einem JTextArea) habe ich ein Problem, weil ich nicht weiß, wie ich das bewerkstelligen kann. Jetzt klarer?


----------



## Wildcard (28. Feb 2005)

Hab ich selbst noch nie versucht, aber vieleicht findest du hier was:
http://java.sun.com/j2se/1.5.0/docs/api/java/nio/charset/Charset.html


----------



## The_S (28. Feb 2005)

Danke für die Mühe, da war ich aber schon   . Für alle, die mir helfen wollen: Soweit bin ich in einem anderen Forum: http://www.jforum.de/showthread.php?t=986&page=1&pp=10 .


----------



## Wildcard (28. Feb 2005)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Danke für die Mühe, da war ich aber schon


Dann hättest du's vieleicht auch lesen sollen  :roll: 
Hier noch mal ausführlich wie's mit Charset funktioniert:
http://forum.javacore.de/viewtopic.php?t=1442


----------



## The_S (28. Feb 2005)

Versteh ich net, warum mir das nicht aufgefallen ist  ???:L    . Auf jeden Fall funktioniert es so, wie auf JavaCore beschrieben! Danke!


----------



## Bleiglanz (1. Mrz 2005)

mein letztes wort dazu:

Du kannst einen String nicht  in einen anderen Zeichensatz konvertieren, weil EIN STRING KEINEN ZEICHENSATZ HAT

Du kannst einen String unter angabe eines ENCODINGS in ein byte[]-Array konvertieren (und zurück)


```
public static String convertToUTF8(String s) {
  String out = null;
  try {
    out = new String(s.getBytes("UTF-8"));
  } catch (java.io.UnsupportedEncodingException e) {
    return null;
  }
  return out;
}
```
auf rechnern, die nicht ISO-8859-1 oder ISO-8859-15 oder UTF-8 als Default-charset verwenden dürfte diese Mehtode ziemlich absurde veränderungen an deinem String vornehmen

Nur weil zufällig UTF-8 bei Codes <255 mit dem ISO-8859-1 übereinstimmt [und dieses wahrscheinlich dein Default charset ist] passiert nix

String(byte[] bytes)
          Constructs a new String by decoding the specified array of bytes using the platform's default charset.

getBytes(String charsetName)
          Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.

aber irgendwie scheint das bei dir nicht anzukommen???


----------



## The_S (1. Mrz 2005)

Bleiglanz hat gesagt.:
			
		

> auf rechnern, die nicht ISO-8859-1 oder ISO-8859-15 oder UTF-8 als Default-charset verwenden dürfte diese Mehtode ziemlich absurde veränderungen an deinem String vornehmen



Warum das? 

Ich weiß nicht, was du an dieser Möglichkeit auszusetzen hast


----------



## Bleiglanz (1. Mrz 2005)

kannst du mal ein paar beispiele angeben, bei denen

!s.equals(convertToUTF8(s))

gilt? die methode macht doch gar nichts???????


----------



## The_S (1. Mrz 2005)

Hab den Code nicht übernommen. Hab mir nur das mit den


```
string.getBytes("Zeichensatz");
```

angeschaut, weil ich mehr nicht brauchte. Bei mir sieht das in etwa so aus:


```
String str = "äöü+#!2§$§$&%&(&)";
String str2 = "";
try {
	str2 = new String(str.getBytes("EUC-KR"));
}
catch (Exception e) {
}
if (!str.equals(str2)) {
    System.out.println(str + " != " + str2);
}
else {
    System.out.println(str + " == " + str2);
}
```

is jetzt nur schnell dahingeklatscht (nicht as wieder jemand wegen dem catch mekert  :wink: )

[edit] hab meinen Code abgeändert um auf deine Frage zu antworten (sry hab ich total vergessen  :bae:    ???:L )[/code]


----------



## Bleiglanz (2. Mrz 2005)

```
str2 = new String(str.getBytes("EUC-KR"));
```
auch diese Zeile ist sinnloser nonsense, weil:

- nicht plattformunabhängig
- bei rechnern mit default EUC-KR: macht sie gar nichts
- bei rechnern mit default != EUC-KR: zerstört sie den String unvorhersehbar


----------



## The_S (2. Mrz 2005)

Bleiglanz hat gesagt.:
			
		

> nicht plattformunabhängig



Warum?



			
				Bleiglanz hat gesagt.:
			
		

> bei rechnern mit default EUC-KR: macht sie gar nichts



Soll auch so sein



			
				Bleiglanz hat gesagt.:
			
		

> bei rechnern mit default != EUC-KR: zerstört sie den String unvorhersehbar



Damit sie für Programme, welche diesen Zeichensatz benutzen lesbar wird.

Ich geb dir mal ein Beispiel: Du willst über Java eine Batch-Datei schreiben, welche einen Ordner beim Klick öffnet. Dieser Ordner heißt "Hörspiel" und liegt in "C:\".

Schreibst du


```
String nichtUmgewandelt = "C:\\Hörspiel";
BufferedWriter bw = new BufferedWriter(new FileOutputStream("Erstelle auf den Desktop" + ".bat"));
bw.write(nichtUmgewandelt);
```

funktioniert das nicht, weil er den Ordner nicht findet (anderer Zeichensatz)

Schreibst du allerdings


```
String nichtUmgewandelt = "C:\\Hörspiel";
String umgewandelt = new String(nichtUmgewandelt.getBytes("Cp850");
BufferedWriter bw = new BufferedWriter(new FileOutputStream("Erstelle auf den Desktop" + ".bat"));
bw.write(umgewandelt);
```

öffnet das Programm den Ordner (Cp850 = Zeichensatz für DOS).


----------



## Bleiglanz (3. Mrz 2005)

das ist zufall, du machst es trotzdem völlig falsch, ich hab jetzt fast schon keine Lust mehr dir das zu erklären

du nimmst den String "C:\\Hörspiel"

=> dann besorgst du dir die Bytes, die den String im Encoding Cp850 darstellen (das ist ja noch OK)

=> dann "re-interpretierst" du diese Byte-Folge nochmal im Default-Encoding der VM (machst also einen ganz anderen String daraus - völlig unklar was das soll...)

=> dann schreibst du den Schrott in einen Writer, bei dem du dich ebenfalls auf das Default-Encoding deiner Maschine verlässt (warum schreibst du die ByteFolge nicht gleich in den reinen Stream - das wäre richtig - sondern wickelst nochmal einen Writer drumherum?) und weil da ebenfalls das Default-Encoding verwendet wird, wird die Bytefolge eben richtig reingeschrieben

EXTREM UNDURCHSCHAUBARER SELTSAMER CODE

richtig wäre das Dekorieren mit einem

OutputStreamWriter(OutputStream out, Charset cs)
          Create an OutputStreamWriter that uses the given charset.

also etwa

```
String nichtUmgewandelt = "C:\\Hörspiel";
BufferedWriter bw = 
new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("Erstelle auf den Desktop" + ".bat") ,"Cp850"));
```

oder irgendsowas


----------



## The_S (3. Mrz 2005)

Aaaaaaaaaaaahhhhhhhhhh! Das war doch nur ein Beispiel!!! Das würde ich natürlich mit eine OutputStreamWriter machen! Sollte nur verdeutlichen für was man sowas brauchen kann!


----------



## Bleiglanz (3. Mrz 2005)

```
String umgewandelt = new String(nichtUmgewandelt.getBytes("Cp850");
```
"sowas" ist ein Kündigungsgrund


----------



## The_S (3. Mrz 2005)

Dafür bin ich ja Azubi und lerns nur  :bae: . Auch wenn du mich dafür vierteilen wirst :wink: . Warum?


----------



## Guest (26. Feb 2006)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Bleiglanz hat gesagt.:
> 
> 
> 
> ...


----------

