Käytössä Delphi 6, pitäisi korvata merkkijonossa erikoismerkit niin että kun jono laitetaan selaimen osoiteriville niin se toimii
Mutta miten saan tutkittua tuolla esimerkillä muutamia merkkejä kuten heittomerkki tai lainausmerkki
tämä pieni esimerkki ei tunnu toimivan, mikäs minulla menee väärin, haluan korvata heittomerkin jonolla %92
for merkki := 1 to length(merkkijono) do begin if instr[merkki] = '\'' then begin jono:=jono+ '%92'; end end;
Mod. lisäsi kooditagit!
En ole Delphiä käyttänyt, mutta missä vaiheessa siirrät muut merkit 'jono' muuttujaan?
Näyttäisi siltä että muuttuja 'jono' saa vain '%92' niin monesti kuin on '\'-merkkejä muuttujassa 'merkkijono'
Ongelman oli että tuota %92 ei tullut kertaakaan.
muut merkit katsottiin vastaavasti if lausekkeilla ja loput merkit kopioitiin suoraan jonoon.
Onko '\''
todella kelvollinen teksti? Heittomerkki on ''''
tai #39
, ja luultavasti sinun olisi viisainta korvatakin se jonolla '%27'
.
Tässä on ilmeisesti taustalla jokin heittomerkkejä koskeva sekaannus. Ascii-heittomerkin (') %-koodattu muoto on tosiaankin %27. Sen sijaan %92 ei tarkoita mitään, ellei oleteta URLin merkistökoodauksen olevan esimerkiksi windows-1252, jolloin se tarkoittaisi käänteistä kaarevaa heittomerkkiä (‘). Mutta URLien merkistökoodaukseksi suositellaan nykyisin UTF-8:aa, ja silloin %92 olisi mahdoton (kielletty).
Yleisesti ottaen on paljon turvallisempaa toimia niin, että käsitellään joukko merkkejä, jotka ovat sellaisinaan sallittuja tai käsiteltävissä järkevästi (esim. muunnettavissa), ja tehdään jokin poikkeuskäsittely, joka kattaa kaikki muut. Siis ei niin, että yritetään käsitellä jotkin erikoistapaukset, jotka tulevat mieleen, vaan järjestelmällisesti tarkistetaan, onko kirjain, olisiko numero, onko sallittu muu merkki, onko koodattavissa oleva merkki - ja jos ei ole, niin tehdään tilanteeseen sopiva virheenkäsittely.
Jos halutaan tehdä merkkijonosta sellainen, jonka voi liimata selaimen osoiteriville, se pitäisi koodata STD 66:n (RFC 3986) mukaisesti.
siispä mulla oli sekaannnus
etsin hetken internetin ihmeellisestä sisällöstä ja löysin pienen koodin
function urlencode(source:string):string; var i:integer; begin result := ''; for i := 1 to length(source) do if not (source[i] in ['A'..'Z','a'..'z','0','1'..'9','-','_','~','.']) then result := result + '%'+inttohex(ord(source[i]),2) else result := result + source[i]; end;
kokeilen parhaillaan tätä jos se toimisi paremmin
Mod. lisäsi kooditagit! Ole hyvä ja lue keskustelun ohjeet.
Jippii tämä koodi toimi niinkuin pitikin
musti kirjoitti:
Jippii tämä koodi toimi niinkuin pitikin
Hyvä jos toimii – mutta se toimii lähinnä maailmassa, jossa merkkijono ei voi sisältää muita merkkejä kuin Ascii-merkkejä.
Tuossahan on turvallinen lähtökohta, koska se koodaa kaikki muut merkit kuin ne, jotka spesifikaatioissa määritellään turvallisiksi. Käytetty koodaustapakin on oikea Ascii-merkeille. Nyt täytyy sitten vain toivoa, että merkkijonossa ei koskaan voi olla esimerkiksi ääkkösiä tai luonnollisten kielten lainausmerkkejä (’, ’, ö jne.).
Eikös se nyt toimis vaikka merkkais kaikki merkit prosenttikoodauksella, kirjaimet a..z ja numerot mukaanlukien? Joten luulisin että yllämainittu koodi toimis kaikissa tapauksissa. Nuo if:n erikoistapaukset vain lyhentävät merkkijonoa yleisillä/standardin mukaisilla merkeillä.
Niin, Yucca varmaan haki sitä, että tuolla koodilla ä ei muutu muotoon %C3%A4 , kuten tapahtuu jos kirjoitat sen selaimen osoiteriville tyyliin:
google.com/?q=ä
Aihe on jo aika vanha, joten et voi enää vastata siihen.