• 1
  • 2
2021-11-25, 20:08
  #1
Medlem
hashs avatar
Jag r novis p Java, s jag hoppas ni har verseende.

Lste p ntet att en String i Java anvnder by default UTF-16 som encoding.

Om jag t ex konkatenerar en strng fljande.
Kod:
String myString = "test1 " + "test2";

I detta lget har allts myString encoding UTF-16.
Om jag nu vill ha min strng som en ISO-8859-1, gr jag fljande...
Kod:
Charset iso88591charset = Charset.forName("ISO-8859-1");
byte[] iso88591bytes = myString.getBytes(iso88591charset);
String newMyString = new String ( iso88591bytes, iso88591charset );

Nu br allts min nya variabel newMyString var ISO-8859-1 encodad, eller har jag fel?

Vad hnder med min String om jag gr fljande eftert?
Kod:
String newString3 = newMyString.replaceAll("2", "3");

Kommer newString3 var UTF-16 nu eller behlla ISO-encodingen?
Osker p om newString3 rknas som en ny String och drfr blir UTF-16?

Ngon som kan bringa klarhet i detta?
Citera
2021-11-25, 20:42
  #2
Bannlyst
Citat:
Ursprungligen postat av hash
Jag r novis p Java, s jag hoppas ni har verseende.

Lste p ntet att en String i Java anvnder by default UTF-16 som encoding.

Om jag t ex konkatenerar en strng fljande.
Kod:
String myString = "test1 " + "test2";

I detta lget har allts myString encoding UTF-16.
Om jag nu vill ha min strng som en ISO-8859-1, gr jag fljande...
Kod:
Charset iso88591charset = Charset.forName("ISO-8859-1");
byte[] iso88591bytes = myString.getBytes(iso88591charset);
String newMyString = new String ( iso88591bytes, iso88591charset );

Nu br allts min nya variabel newMyString var ISO-8859-1 encodad, eller har jag fel?

Vad hnder med min String om jag gr fljande eftert?
Kod:
String newString3 = newMyString.replaceAll("2", "3");

Kommer newString3 var UTF-16 nu eller behlla ISO-encodingen?
Osker p om newString3 rknas som en ny String och drfr blir UTF-16?

Ngon som kan bringa klarhet i detta?
Jag orkar inte riktigt hnga med hr, men vad r det du vill gra egentligen? Det knns som det gr att gra lite smidigare n s hr.
Citera
2021-11-25, 21:04
  #3
Medlem
hashs avatar
Citat:
Ursprungligen postat av realFEZ
Jag orkar inte riktigt hnga med hr, men vad r det du vill gra egentligen? Det knns som det gr att gra lite smidigare n s hr.

Jag kan frst att du uppfattar det lite flummigt.
Grejen r den att jag inte frstr hur Java hanterar String klassen med encoding.
Jag har lst mig till p ntet att String klassen anvnder UTF-16 som standard.

Mitt problem r att jag vill skriva ut en payload med ISO-8859-1, men det slutar alltid med UTF-8.
Vilket jag misstnker r faktiskt operativsystemets "locale", i en Redhat Linux.

Jag vill inte ha UTF-8 utan en payload med ISO-8859-1.

ISO-8859-1 krvs fr att jag vet att mottagare-systemet, ett Mainframe system som inte klarar ngot annat.

Jag har upptckt att nr jag kalkylerar ut HMACSHA256, s blir den olika beroende p encoding.

Sen mitt andra problem r att jag suger p Java
Min fundering r, s fort jag ndrar innehllet i en String i java med innehll, kan encodingen ndras?
__________________
Senast redigerad av hash 2021-11-25 kl. 21:08.
Citera
2021-11-25, 21:33
  #4
Bannlyst
Citat:
Ursprungligen postat av hash
Jag kan frst att du uppfattar det lite flummigt.
Grejen r den att jag inte frstr hur Java hanterar String klassen med encoding.
Jag har lst mig till p ntet att String klassen anvnder UTF-16 som standard.

Mitt problem r att jag vill skriva ut en payload med ISO-8859-1, men det slutar alltid med UTF-8.
Vilket jag misstnker r faktiskt operativsystemets "locale", i en Redhat Linux.

Jag vill inte ha UTF-8 utan en payload med ISO-8859-1.

ISO-8859-1 krvs fr att jag vet att mottagare-systemet, ett Mainframe system som inte klarar ngot annat.

Jag har upptckt att nr jag kalkylerar ut HMACSHA256, s blir den olika beroende p encoding.

Sen mitt andra problem r att jag suger p Java
Min fundering r, s fort jag ndrar innehllet i en String i java med innehll, kan encodingen ndras?
Ahaja. Det lter som riktigt gamla saker det hr. Det var lnge sen jag pysslade med Java och jag kan inga detaljer kring encodingen dr. Vad menar du med "skriva ut en payload"? Hur gr du det?
Citera
2021-11-25, 21:42
  #5
Medlem
Emma18s avatar
Det stmmer att Java ibland anvnder UTF-16 internt fr att lagra strngar, exakt hur det lagras beror p vilket Java-version du kr och faktiskt vad strngen innehller. Detta r dock ingenting du enkelt kan ndra, och inte ngonting du behver ndra. Din extra kod frndrar inte hur java hanterar strngen internt, utan det enda du gr r att exportera innehllet i din strng till en byte-array fr att sen importera det till en strng igen.

Om du vill skriva ISO-8859-1 till en textfil kan du gra till exempel:

Kod:
File file = new File("c:\\TEMP\\file.txt");
BufferedWriter writer = Files.newBufferedWriter(file.toPath(), Charset.forName("ISO-8859-1"));
writer.write(myString);

Annars s i ditt exempel s skriver du ju redan texten till en byte-array med hjlp av:

Kod:
Charset iso88591charset = Charset.forName("ISO-8859-1");
byte[] iso88591bytes = myString.getBytes(iso88591charset);
Denna byte-array kan du ju sen gra vad du vill med, skriva till fil eller skicka till mottagaren.

I teorin gr det att ndra hur Java lagrar strngar internt, men ven om du gjorde det skulle det inte pverka vad som hnder nr koden krs, utan bara internt. I modern Java lagras faktiskt strngarna som ISO-8859-1 s lnge de tecken som finns i strngen finns i den teckenuppsttningen men det gr inte att filskrivning sker med ISO-8859-1.
__________________
Senast redigerad av Emma18 2021-11-25 kl. 21:47.
Citera
2021-11-25, 21:50
  #6
Medlem
hashs avatar
Citat:
Ursprungligen postat av realFEZ
Ahaja. Det lter som riktigt gamla saker det hr. Det var lnge sen jag pysslade med Java och jag kan inga detaljer kring encodingen dr. Vad menar du med "skriva ut en payload"? Hur gr du det?

Payload r egentligen bara filens innehll, behver skriva ut den till en EDI-process med rtt encoding.

Men som sagt, jag frstr inte hur Java String klass fungerar.
Kan encoding frndras s fort man gr en frndring i en String variabel?
Citera
2021-11-25, 23:05
  #7
Medlem
Citat:
Ursprungligen postat av hash
Payload r egentligen bara filens innehll, behver skriva ut den till en EDI-process med rtt encoding.

Men som sagt, jag frstr inte hur Java String klass fungerar.
Kan encoding frndras s fort man gr en frndring i en String variabel?

Vilken del av dokumentationen fr String r du osker p? En String r immutable vilket betyder att innehllet aldrig kan ndras. Dremot kan man frsts ndra en variabel s att den refererar en annan strng (om variabeln inte r final), vilket grs med en assignment operator.

https://docs.oracle.com/javase/7/doc...ng/String.html
Citera
2021-11-26, 07:16
  #8
Moderator
vhes avatar
Citat:
Ursprungligen postat av hash
Men som sagt, jag frstr inte hur Java String klass fungerar.
Kan encoding frndras s fort man gr en frndring i en String variabel?

Nu var det 20 r sedan jag kodade Java, men inte tnker jag lta total okunskap stoppa mig frn att posta!

Jag tror du tnker p String-klassen fel. Tnk inte "encodad strng", tnk "abstrakt objekt som representerar vilka tecken som helst". Pongen med klassen r att den skall kunna hantera godtyckliga unicodetecken (inte tecken i en viss encoding - bara tecken). Det r nr du behver serialisera din strng som du behver fundera p encoding. S, m.a.o., gr all den manipulation av strngen du behver, och nr det r dags dumpa ut den som en payload som du encodar den enligt Emmas mall ovan.

Eventuella checksummor/kryptografiska signaturer grs p den encodade datan.
Citera
2021-11-26, 09:52
  #9
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av vhe
Nu var det 20 r sedan jag kodade Java, men inte tnker jag lta total okunskap stoppa mig frn att posta!

Jag tror du tnker p String-klassen fel. Tnk inte "encodad strng", tnk "abstrakt objekt som representerar vilka tecken som helst". Pongen med klassen r att den skall kunna hantera godtyckliga unicodetecken (inte tecken i en viss encoding - bara tecken). Det r nr du behver serialisera din strng som du behver fundera p encoding. S, m.a.o., gr all den manipulation av strngen du behver, och nr det r dags dumpa ut den som en payload som du encodar den enligt Emmas mall ovan.

Eventuella checksummor/kryptografiska signaturer grs p den encodade datan.
Allts, String-klassen r i princip en "svart lda" dr man inte behver bekymra sig om hur data lagras "under motorhuven"?
Citera
2021-11-27, 17:47
  #10
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av hash
Ngon som kan bringa klarhet i detta?
Vet inte om du tycker att detta klarnat via de svar du ftt, d de ibland varit otydliga och delvis missvisande.

Javas fundamentala datatyp fr detta, char, representerar alltid Unicode. Ingenting annat. Javas String likas. Glm encodingformat helt hr. (*1)

Nr man av ngot skl vill hantera tecken utanfr dessa typers runtimelagring, i ex en fil, en ntverksstrm eller annat, s behver man omvandla dessa till ett transportformat. Frst hr kommer encoding och olika format in i bilden.

De metoder som omvandlar tecken till ett transportformat eller tvrtom omvandlar allts frn Unicode till ett encodingformat eller tillbaka. Vissa dr man anger format via metodparametrar och vissa med defaultformat. Detta r vl dokumenterat i javadoc:en fr Java Core API och vl vrt att kolla upp. Typen Charset anvnds fr encodingformat.

Encodingformatet UTF-16 r frvisso vldigt nra Unicode i sin lagring, men det r fortfarande 2 olika saker.

Med detta som grund s kan vi g igenom dina exempel steg fr steg:

Citat:
Ursprungligen postat av hash
Lste p ntet att en String i Java anvnder by default UTF-16 som encoding.

Om jag t ex konkatenerar en strng fljande.
Kod:
String myString = "test1 " + "test2";

I detta lget har allts myString encoding UTF-16.
Nej, den anvnder alltid Unicode. (*1)

Citat:
Ursprungligen postat av hash
Om jag nu vill ha min strng som en ISO-8859-1, gr jag fljande...
Kod:
Charset iso88591charset = Charset.forName("ISO-8859-1");
byte[] iso88591bytes = myString.getBytes(iso88591charset);
String newMyString = new String ( iso88591bytes, iso88591charset );
Din myString r Unicode.
Anropet getBytes() ovan omvandlar frn Unicode till angivet format.
Din iso88591bytes r en array av bytes (inte tecken lngre) i encondingformatet "ISO-8859-1". (*2)
Konstruktorn ovan fr String omvandlar indata frn dess encodingformat till Unicode.
Din newMyString r Unicode.

Citat:
Ursprungligen postat av hash
Vad hnder med min String om jag gr fljande eftert?
Kod:
String newString3 = newMyString.replaceAll("2", "3");
DIn newString3 r Unicode.

(*1): De r specificerat i Javas sprkdefinition att det r Unicode som representeras i char och String. ven om det r teoretiskt mjligt att enl specifikationen fullflja definitionen och nd lagra tecken internt i en String i ngot annat format, s spelar det ingen roll. Alla metoder som jobbar med typen char i String, jobbar med Unicode i sitt grnsssnitt.

(*2): Detta frutsatt att plattformen accepterade det format du angav. Vissa format mste stdjas enl standarden, bland annat ISO-8859-1.
Citera
2021-11-30, 02:16
  #11
Medlem
Citat:
Ursprungligen postat av kjellbrel
Encodingformatet UTF-16 r frvisso vldigt nra Unicode i sin lagring, men det r fortfarande 2 olika saker.

Med Unicode menar du d UTF-32? Det r inte lika vanligt som UTF-8 och UTF-16 som r de tv vanligaste formaten. Javastandarden anger frresten att UTF-16 ska anvndas av Java frutom i Character-klassen och vissa andra undantag.
Citera
2021-11-30, 16:05
  #12
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av Hominem
Med Unicode menar du d UTF-32? Det r inte lika vanligt som UTF-8 och UTF-16 som r de tv vanligaste formaten. Javastandarden anger frresten att UTF-16 ska anvndas av Java frutom i Character-klassen och vissa andra undantag.
Nej, jag menar definitivt inte UTF-32.

Lste du min (*1) frn fregende inlgg? Jag ville hlla isr vad man ser och r garanterad nr man anvnder char och String i Java frn implementationsdetaljer i JVM:en.

Som utvecklare ser du enbart Unicode (Unicode code points) i typen char i Java (och drmed samtliga andra core API-anrop som jobbar med den typen i sina metoder, ex i String, Character mm). Eftersom Unicode vuxit ver sin ursprungliga maxstorlek (16 bitar) s har det blivit andra problem med att char r 16 bitar (surrogate pairs fr att beskriva enskilda tecken), men det r en frga fr sig.

Som utvecklare hanterar man encodingformat frst nr man omvandlar frn char till transportformat eller tillbaka.

Unicode -> (encode) -> UTF-x/ISO...mm -> (decode) -> Unicode

Det r viktigt ur den hr synpunkten att se char (Unicode) fr sig och transportformat (UTF-x mm) fr sig och veta att man sjlv i detta lge gr encoding/decoding fr omvandla mellan dem och att man sjlv ansvarar fr vilket encodingformat som skall anvndas. Detta gller ven om encodingformatet r identiskt med kllan. ven om de r helt identiska s r de i tv olika format, som representerar olika saker.

Som utvecklare skall man enbart bry sig om att man har Unicode code points i char helt oavsett hur JVM:en r implementerad.

TS frskte pverka lagringsformatet fr innehllet i String. Mina frtydliganden var till fr att klargra varfr detta inte fungerade.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in