PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - String läßt sich nicht zu Integer wandeln.


ooAlbert
2007-11-27, 12:10:58
Hi,

ich hab hier einen String den ich zeichen für zeichen in ein Array schieben möchte aber in dem array sollen die Ascii Dezimalwerte.

Drum hab ich folgendes probiert:


int[] sArray = int[255];

while (i == s.length)
{
sArray[ i ] = Integer.parseInt(s.charAt(i));
i++;
}


Java meint aber, das das "Integer.parseInt" nicht auffindbar wäre ?

astro
2007-11-27, 12:41:38
Mit was bzw. wo hast du den int i initialisiert?
Deine while-Bedingung mag mir auch nicht so ganz einleuchten ;(

edit: das sollte weiterhelfen: API (http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int))

Gast
2007-11-27, 12:53:09
Außerdem scheint er es einmal zuviel zu machen.. oder?

ooAlbert
2007-11-27, 12:54:25
ich hab jetzt nicht alles hingeschrieben nur das wichtige :)

aber nochmal etwas ausführlicher:


int[] sArray = int[255];
int i = 0;
String s = "ABC";

while (i == s.length)
{
sArray[ i ] = Integer.parseInt(s.charAt(i));
i++;
}


die schleife soll so lange laufen, bis "s" komplett durchlaufen wurde. deshalb die längenprüfung.
Ergebnis sollte dann sein: 65, 66, 67; was die Dezimalzahlen zur A, B, C im Ascii sind.

Gast
2007-11-27, 13:07:02
die schleife soll so lange laufen, bis "s" komplett durchlaufen wurde


Dann sollte es aber so aussehen:

while (i != s.length)
{
...
}


;)

ooAlbert
2007-11-27, 13:09:45
nagut :) aber kann es vielleicht sein das integer.parseint einfach nicht mit "char" umgehen kann?

Oder was gibts noch für alternativen mein vorhaben zu realisieren?

Dr.Doom
2007-11-27, 13:13:19
sArray[ i ] = Integer.parseInt(s.charAt(i));
Bin mir nicht 100%-ig sicher (meine Stringverarbeitung bei Java ist was eingerostet), aber charAt() hat den Rückgabetyp 'char'. Evtl musst du da noch einen Cast einfügen:

sArray[ i ] = Integer.parseInt( (int)s.charAt(i) );

astro
2007-11-27, 13:22:07
nagut :) aber kann es vielleicht sein das integer.parseint einfach nicht mit "char" umgehen kann?

Deswegen der Link zur API ;)

An exception of type NumberFormatException is thrown if any of the following situations occurs:
[...]
# The value represented by the string is not a value of type int.

ooAlbert
2007-11-27, 13:23:23
so hats funktioniert: sArray[ i ] = (int)s.charAt(i) ;

muß man erstmal drauf kommen :)

astro
2007-11-27, 13:30:55
sArray[ i ] = s.charAt(i) ;
reicht eigentlich, da er ja schon auf int castet, wenn Du es in Dein int-Array schreibst ;)

Achill
2007-11-27, 22:33:59
Ich denke, das ist nicht so einfach ... ;)

Java benutzt (mindestens bei meinem System) den Zeichensatz "utf-8" per default.

Es gibt außerdem in der String-Klasse Methoden, die die Umwandlung eines Strings in ein Byte-Array übernehmen. Dazu kurz ein Beispiel, das auch den Zeichensatz berücksichtigen (Wölt ist absichtlich gewählt um Umlaute dabei zu haben).



String s = "Hallo Wölt";

System.out.print("defaultCharset: " + Charset.defaultCharset());

System.out.print("\nutf-8:");
for (byte aByte : s.getBytes()) {
System.out.print(" " + aByte);
}

System.out.print("\nascii:");
for (byte aByte : s.getBytes(Charset.forName("ASCII"))) {
System.out.print(" " + aByte);
}

System.out.print("\ncharsets: " + Charset.availableCharsets());



Ergibt das:



defaultCharset: UTF-8
utf-8: 72 97 108 108 111 32 87 -61 -74 108 116
ascii: 72 97 108 108 111 32 87 63 108 116
charsets: {Big5=Big5, Big5-HKSCS=Big5-HKSCS, COMPOUND_TEXT=COMPOUND_TEXT, EUC-JP=EUC-JP, EUC-KR=EUC-KR, GB18030=GB18030,
GB2312=GB2312, GBK=GBK, IBM-Thai=IBM-Thai, IBM00858=IBM00858, IBM01140=IBM01140, IBM01141=IBM01141, IBM01142=IBM01142,
IBM01143=IBM01143, IBM01144=IBM01144, IBM01145=IBM01145, IBM01146=IBM01146, IBM01147=IBM01147, IBM01148=IBM01148, IBM011
49=IBM01149, IBM037=IBM037, IBM1026=IBM1026, IBM1047=IBM1047, IBM273=IBM273, IBM277=IBM277, IBM278=IBM278, IBM280=IBM280
, IBM284=IBM284, IBM285=IBM285, IBM297=IBM297, IBM420=IBM420, IBM424=IBM424, IBM437=IBM437, IBM500=IBM500, IBM775=IBM775
, IBM850=IBM850, IBM852=IBM852, IBM855=IBM855, IBM857=IBM857, IBM860=IBM860, IBM861=IBM861, IBM862=IBM862, IBM863=IBM863
, IBM864=IBM864, IBM865=IBM865, IBM866=IBM866, IBM868=IBM868, IBM869=IBM869, IBM870=IBM870, IBM871=IBM871, IBM918=IBM918
, ISO-2022-CN=ISO-2022-CN, ISO-2022-JP=ISO-2022-JP, ISO-2022-JP-2=ISO-2022-JP-2, ISO-2022-KR=ISO-2022-KR, ISO-8859-1=ISO
-8859-1, ISO-8859-13=ISO-8859-13, ISO-8859-15=ISO-8859-15, ISO-8859-2=ISO-8859-2, ISO-8859-3=ISO-8859-3, ISO-8859-4=ISO-
8859-4, ISO-8859-5=ISO-8859-5, ISO-8859-6=ISO-8859-6, ISO-8859-7=ISO-8859-7, ISO-8859-8=ISO-8859-8, ISO-8859-9=ISO-8859-
9, JIS_X0201=JIS_X0201, JIS_X0212-1990=JIS_X0212-1990, KOI8-R=KOI8-R, KOI8-U=KOI8-U, Shift_JIS=Shift_JIS, TIS-620=TIS-62
0, US-ASCII=US-ASCII, UTF-16=UTF-16, UTF-16BE=UTF-16BE, UTF-16LE=UTF-16LE, UTF-32=UTF-32, UTF-32BE=UTF-32BE, UTF-32LE=UT
F-32LE, UTF-8=UTF-8, windows-1250=windows-1250, windows-1251=windows-1251, windows-1252=windows-1252, windows-1253=windo
ws-1253, windows-1254=windows-1254, windows-1255=windows-1255, windows-1256=windows-1256, windows-1257=windows-1257, win
dows-1258=windows-1258, windows-31j=windows-31j, x-Big5-Solaris=x-Big5-Solaris, x-euc-jp-linux=x-euc-jp-linux, x-EUC-TW=
x-EUC-TW, x-eucJP-Open=x-eucJP-Open, x-IBM1006=x-IBM1006, x-IBM1025=x-IBM1025, x-IBM1046=x-IBM1046, x-IBM1097=x-IBM1097,
x-IBM1098=x-IBM1098, x-IBM1112=x-IBM1112, x-IBM1122=x-IBM1122, x-IBM1123=x-IBM1123, x-IBM1124=x-IBM1124, x-IBM1381=x-IB
M1381, x-IBM1383=x-IBM1383, x-IBM33722=x-IBM33722, x-IBM737=x-IBM737, x-IBM834=x-IBM834, x-IBM856=x-IBM856, x-IBM874=x-I
BM874, x-IBM875=x-IBM875, x-IBM921=x-IBM921, x-IBM922=x-IBM922, x-IBM930=x-IBM930, x-IBM933=x-IBM933, x-IBM935=x-IBM935,
x-IBM937=x-IBM937, x-IBM939=x-IBM939, x-IBM942=x-IBM942, x-IBM942C=x-IBM942C, x-IBM943=x-IBM943, x-IBM943C=x-IBM943C, x
-IBM948=x-IBM948, x-IBM949=x-IBM949, x-IBM949C=x-IBM949C, x-IBM950=x-IBM950, x-IBM964=x-IBM964, x-IBM970=x-IBM970, x-ISC
II91=x-ISCII91, x-ISO-2022-CN-CNS=x-ISO-2022-CN-CNS, x-ISO-2022-CN-GB=x-ISO-2022-CN-GB, x-iso-8859-11=x-iso-8859-11, x-J
IS0208=x-JIS0208, x-JISAutoDetect=x-JISAutoDetect, x-Johab=x-Johab, x-MacArabic=x-MacArabic, x-MacCentralEurope=x-MacCen
tralEurope, x-MacCroatian=x-MacCroatian, x-MacCyrillic=x-MacCyrillic, x-MacDingbat=x-MacDingbat, x-MacGreek=x-MacGreek,
x-MacHebrew=x-MacHebrew, x-MacIceland=x-MacIceland, x-MacRoman=x-MacRoman, x-MacRomania=x-MacRomania, x-MacSymbol=x-MacS
ymbol, x-MacThai=x-MacThai, x-MacTurkish=x-MacTurkish, x-MacUkraine=x-MacUkraine, x-MS950-HKSCS=x-MS950-HKSCS, x-mswin-9
36=x-mswin-936, x-PCK=x-PCK, x-UTF-16LE-BOM=x-UTF-16LE-BOM, X-UTF-32BE-BOM=X-UTF-32BE-BOM, X-UTF-32LE-BOM=X-UTF-32LE-BOM
, x-windows-50220=x-windows-50220, x-windows-50221=x-windows-50221, x-windows-874=x-windows-874, x-windows-949=x-windows
-949, x-windows-950=x-windows-950, x-windows-iso2022jp=x-windows-iso2022jp}

Gast
2007-11-28, 14:49:23
Java benutzt (mindestens bei meinem System) den Zeichensatz "utf-8" per default.


intern benutzt java immer unicode für chars bzw. Strings. lediglich die in/outputstreams benutzen UTF-8.

HellHorse
2007-11-28, 20:37:17
intern benutzt java immer unicode für chars bzw. Strings.
UTF-16. Ausserhalb der BMP bist du gefux0r3d.

lediglich die in/outputstreams benutzen UTF-8.
Nö, die nehmen den default Wert für die entsprechende Platform.

Coda
2007-11-28, 20:58:05
UTF-16. Ausserhalb der BMP bist du gefux0r3d.
Dann ist es auch kein UTF-16. UTF-16 kann Zeichen außerhalb der BMP kodieren ;)

AtTheDriveIn
2007-11-28, 23:49:36
BMP?

Xmas
2007-11-28, 23:53:54
Basic Multilingual Plane (http://de.wikipedia.org/wiki/Basic_Multilingual_Plane)

HellHorse
2007-11-29, 06:59:25
Dann ist es auch kein UTF-16. UTF-16 kann Zeichen außerhalb der BMP kodieren ;)
String kann AFAIK Zeichen ausserhalb der BMP kodieren, bloss char und Character halt nicht. Musst dann halt int statt char nehmenen siehe dazu
http://java.sun.com/javase/6/docs/api/java/lang/String.html#codePointAt(int) vs. http://java.sun.com/javase/6/docs/api/java/lang/String.html#charAt(int)

Gast
2007-11-29, 11:10:36
ich häng mich mal an :) ich hab nämlich das Problem, das Umlaute bei mir nicht korrekt dargestellt werden.

ich hab woanders mal das gefunden:

try
{
System.setOut(new java.io.PrintStream(System.out, true, "cp850"));
} catch( java.io.UnsupportedEncodingException e )
{
e.printStackTrace();
}

hatte aber keine Wirkung. Das Beispiel von weiter oben macht bei mir nur eine Fehlermeldung das die Variable nicht gefunden wurde.

wie muß es denn richtig lauten damit Umlaute korrekt eingelesen werden und auch korrekt ausgegeben werden?

Trap
2007-11-29, 11:35:49
ich häng mich mal an :) ich hab nämlich das Problem, das Umlaute bei mir nicht korrekt dargestellt werden.
Umlaute im Sourcecode oder eingelesene Umlaute?

Gast
2007-11-29, 11:45:25
beides eingegebene umlaute über tastatur und natürlich auch welche die schon fest im Programm stehen für ausgabe texte.

Aber ich glaub ich hab es jetzt :)

input:

try
{
BufferedReader in = new BufferedReader(new InputStreamReader
(System.in, "cp850"));
Text = in.readLine();
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}

output:

Das steht dann ganz oben in der MAIN.
try
{
System.setOut(new java.io.PrintStream(System.out, true, "cp850"));
}
catch (java.io.UnsupportedEncodingException e)
{
e.printStackTrace();
}

Das einzige was ich mich noch frage ist, werden mir die Umlaute nur korrekt angezeigt oder kann ich auch davon ausgehen, das die Umlaute korrekt weitergegeben werden, beispielsweise an ein anderes Programm was mit dem erzeugten String irgendetwas machen soll? Beispielsweise setz ich den String in einer Konsolenanweisung für Windows ein als Parameter oä.

PHuV
2007-11-29, 13:17:03
Du mußt aufpassen, und darauf fallen viele rein, unter der Eingabekonsole werden die Umlaute mit CP850 angezeigt. Windows verwendet jedoch intern ISO-8859-1.

Wenn Du die korrekte Zeichensatzdarstellung mit ISO wählst, werden die Sonderzeichen auf der Konsole (da CP850) nicht richtig dargestellt. Läßt Du Dir jedoch diese Ausgabe in einem Editor anzeigen, ist sie korrekt.

Alles klar? ;)

Tipp, installiere eine cygwin (http://www.cygwin.com/)-Konsole, dann hast Du eine korrekte Darstellung der Umlaute auf beiden Seiten.

Datei umlaut.txt

äöüÄÖÜß

Ausgabe cygwin

cat umlaut.txt
>äöüÄÖÜß


Ausgabe Konsole (cmd.exe)

D:\>type umlaut.txt
õ÷³─Í▄▀