Toon posts:

[Java] String escapen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben nu een programma aan het maken dat geen gebruik maakt van een DBMS, maar gewoon losse bestanden. Alleen nu moet ik ook strings gaan oplsaan. Op zich geen probleem, maar ik wil dat elke string op zijn eigen regel komt. Dus maximaal één regel per string. Alleen weet ik niet hoe ik een string op een goede manier kan escapen.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

\n ?

En als verder \n ook mogen voorkomen in de tekst op de databases, dan moet je een token zien te vinden waarmee je dus kan zien dat het een van jezelf is. En dit lijkt me vrij lastig omdat je natuurlijk nooit kan garanderen dat jouw sequence niet per ongeluk een nuttige tekst is in de database.


[k*t oplossing]
Maar probeer anders eens:

int_is_super_koel_en_dit_is_een_stom_stuk_tekst als scheidingstoken. De kans is erg klan dat een ander dit stuk tekst ook al gebruikt :P

[ Voor 100% gewijzigd door Alarmnummer op 23-04-2003 16:24 ]


Verwijderd

Topicstarter
Ik kan wel \n gaan escapen, maar dan krijg je bij het terugzetten problemen wanneer iemand gewoon \n in zijn string zet.

  • nhimf
  • Registratie: September 2000
  • Laatst online: 19-08 10:00

nhimf

Lekker belangrijk allemaal

ik zou gaan voor \n\r (ja niet verkeerd om)
\n\r is nl een \r\n verkeerd om (de windows enter)
en evt kan je \0 erbij zetten
\0\n\r\0 (dan moet het wel betrekkelijk uniek zijn, aangezien de \0 (null karakter) niet in strings mogen voorkomen ;)

Ik stink niet, ik ruik gewoon anders


Verwijderd

Topicstarter
nhimf ik snap niet helemaal hoe je dat bedoelt. Zou je het iets uitgebreider kunnen uitleggen?

  • nhimf
  • Registratie: September 2000
  • Laatst online: 19-08 10:00

nhimf

Lekker belangrijk allemaal

nou de \0 (0x00) is een karakter dat normaal strings afsluit.
dus als je een string hebt "dit is een string"
dan staat dit in het geheugen:
dit is een string\0
Dit noemen ze een null terminated string. Deze is zeer gebruikelijk.
Als je een enter tiept en opslaat in windows codering dan slaat hij 2 karakters op
een \r (carriage return) en een \n (newline)
onder bijv *nix is dit alleen een \n
als je de windows enter omdraait \n\r dan krijg je dus een volgorde die je normaal niet tegen zal komen.
Zet jet hier voor en achter nog een null karakter (de \0) dan heb je due \0\n\r\0
Dit is een reeks karakters die je normaal gesproken nooit kan tiepen (ik heb geen toets voor een null karakter op mijn toetsenbord).
Dus heb je een unieke afscheiding, en kan je hierop je strings afscheiden. (moet je wel binair gaan lezen denk ik, weet ik niet zeker)

Ik stink niet, ik ruik gewoon anders


Verwijderd

Topicstarter
Ah thanks ik snap je idee :). Ik zal eens kijken of ik hiermee alles kan doen wat ik wil (en of het lukt ;)).

  • nhimf
  • Registratie: September 2000
  • Laatst online: 19-08 10:00

nhimf

Lekker belangrijk allemaal

succes ermee.
Mocht het niet werken, dan zal je het binair moeten gaan opslaan een een index betand maken waarin staat waar een nieuwe string begint (denk maar aan de TOC op een cd of een FAT op fat32), maar dit is meer programmeer werk, maar met goed programmeer werk is wel wel fail proof, omdat je dan echt alle karakters kan gebruiken (ook de \0)

Ik stink niet, ik ruik gewoon anders


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

nhimf schreef op 23 april 2003 @ 16:34:
nou de \0 (0x00) is een karakter dat normaal strings afsluit.
dus als je een string hebt "dit is een string"
dan staat dit in het geheugen:
dit is een string\0
Dit noemen ze een null terminated string. Deze is zeer gebruikelijk.
in C en C++ ja, verder niet echt
Maar ik zou verder geen \0 in een tekstbestand gaan zetten, daar kunnen sommige implementaties het imho moeilijk mee gaan krijgen bij het inlezen
Als je een enter tiept en opslaat in windows codering dan slaat hij 2 karakters op
een \r (carriage return) en een \n (newline)
onder bijv *nix is dit alleen een \n
als je de windows enter omdraait \n\r dan krijg je dus een volgorde die je normaal niet tegen zal komen.
Wie garandeerd dat? En wat als je 2 windows' enters achter elkaar invoert? Dan staat daar dus ook en \r\n
Zet jet hier voor en achter nog een null karakter (de \0) dan heb je due \0\n\r\0
Dit is een reeks karakters die je normaal gesproken nooit kan tiepen (ik heb geen toets voor een null karakter op mijn toetsenbord).
dan zit je weer met die 0 :)
Dus heb je een unieke afscheiding, en kan je hierop je strings afscheiden. (moet je wel binair gaan lezen denk ik, weet ik niet zeker)
ja, in binair kan het weer wel natuurlijk :)


Maar wat ik zou doen is gewoon jouw eigen scheidingsteken gaan gebruiken, en dan dat scheidingsteken vervolgens in de strings zelf gaan escapen!
Stel je gebruikt een "," als scheidingsteken. Om te voorkomen dat het fout gaat als iemand een "," in z'n string gebruikt, zet je alle ","'s van tevoren om naar "\," (en dan moet je "\" natuurlijk ook omzetten naar "\\" om te voorkomen dat als iemand een "\" gevolgd door een "," gebruikt, dat verkeerd geinterpreteerd wordt ;))

Dit kan natuurlijk met elk teken, en het voorkomt altijd dat de gebruiker per ongeluk op een of andere manier een rare combinatie in die file krijgt die toevallig nou net als jouw scheidingssequence gebruikt wordt

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik heb maar afgezien van een opslagtechniek mbv een scheidingsteken en ga binair verder icm een soort van TOC. Vooral omdat ik zeker wil/moet zijn dat het fool-proof is.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Een scheidingsteken zoals ik voorstelde is foolproof, en je hebt het gemak dat het gewone tekstfiles zijn, en je ze dus gewoon kunt editen

ik gebruik het ook altijd voor config files e.d.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
toch wel erg dat na 50 jaar computing mensen er nog steeds geen standaard is voor een newline :) ... zet je code anders in XML en gebruik p-tags. Dat doen wij hier (moet je dus wel weer de rest v/d string xml-encoden) maar dat is tenminste standaard (kun je ook dan weer eenvoudig omzetten naar de echt newline / taal). Een TOC (hoe ga je dat doen?) lijkt me ook een beetje overmaat.

Als je weet wat je in je DB steekt kun je het erook uitkrijgen. \0 is een tekstbestand is idd om problemen vragen... Als je helemaal geen data manipulatie moet doen van je strings (dingen like search) kun je nog gaan BLOB-ben maar ik neem aan dat VARCHAR beter geoptimisileerd kan worden (?).

  • jvo
  • Registratie: Augustus 2001
  • Laatst online: 04-10-2023

jvo

geen commentaar

Full proof is bijvoorbeeld gewoon een @\n als scheider gebruiken en elke @ in de tekst te vervangen met @@. Dus de twee Strings "Bla@\nBla" en "Kwek@@Kwek" worden opgeslagen als "Bla@@\nBla@\nKwek@@@@Kwek". En dit kan altijd teruggelezen worden...

En het is inderdaad in Java zo dat er niet met zero terminated strings wordt gewerkt en er dus gewoon een \0 in een String mag zitten.

[ Voor 23% gewijzigd door jvo op 24-04-2003 00:19 . Reden: Aanpassinkje ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 23 April 2003 @ 18:50:
Ik heb maar afgezien van een opslagtechniek mbv een scheidingsteken en ga binair verder icm een soort van TOC. Vooral omdat ik zeker wil/moet zijn dat het fool-proof is.
Als je toch met java bezig bent, waarom geen ObjectOutputStream? Erg handig als je niet weet wat je allemaal op gaat slaan. Alleen jammer dat het allemaal serialized moet worden :)
Pagina: 1