Rivinvaihdot ja kappaleet datan käsittelyssä, luku 1 Tausta: miten kirjavuuteen päädyttiin:

Kirjoituskoneista tietokoneisiin

Rivinvaihto ja kappale ovat melko selviä asioita silloin, kun tarkastellaan vain paperilla olevia dokumentteja. Tosin emme ehkä ajattele rivinvaihtoja minään "olioina", vaan teksti vain jakautuu eri riveille.

Tietokoneessa asia on toinen. Jos teksti halutaan esittää tietokoneella luettavassa muodossa (digitaalisessa muodossa) siten, että esityksessä on mukana tekstin jako riveihin, on rivinvaihdotkin jotenkin esitettävä. Mutta pitäisikö teksti esittää siten? Hyvä kysymys. Joskus rivinvaihdoilla on rakenteellinen merkitys, esimerkiksi luetteloita esitettäessä. Useat vanhat ohjelmointikielet suunniteltiin niin, että lähdekielinen ohjelma piti jakaa riveihin määrätyllä tavalla. Lisäksi ATK:n alkuaikoina tekstidatan esitys oli varsin alkeellista ja sitä käsittelevät ohjelmat rajoittuneita. Niinpä useinkin tekstin kirjoittajan piti jakaa teksti valmiiksi riveille, jotta se tulostuisi kunnolla. Tekstieditoritkin olivat usein ns. rivieditoreja, joissa rivijako oli olennainen.

Joka tapauksessa tekstidatan tallentamiseen ja käsittelyyn tietokoneilla on alusta alkaen kuulunut kysymys, mikä on rivinvaihdon esitysmuoto. Tässä jutussa käsiteltävät ongelmat johtuvat enimmäkseen siitä, että tämä kysymys on eri tietokoneissa, ohjelmissa ja järjestelmissä ratkaistu eri tavoin.

Yksi vanhimmista tavoista, joka on edelleen laajasti käytössä, perustuu alkujaan ajatusmalliin, joka on peräisin vanhoista mekaanisista kirjoituskoneista. Sellaisella kirjoitettaessa rivin lopettaminen ja uuden aloittaminen koostuu toisaalta telanpalautuksesta (carriage return) eli telan siirtämisestä ääriasentoon oikealle niin, että kirjoituskohta tulee paperin vasempaan reunaan, toisaalta rivinsiirrosta (line feed) eli telan pyörittämisestä yhden rivin verran. (Alkujaan nämä tehtiin vivusta vääntämällä, myöhemmin erityisellä rivinvaihtonäppäimellä return key.) Tätä jäljitellen otettiin käyttöön kontrollikoodit eli "kontrollimerkit" CR ja LF. Tämä tarkoittaa, että tiedostoon tallennetaan kaksi dataa (käytännössä yleensä luvut 13 ja 10), joista on sovittu, että ne eivät esitä mitään merkkejä vaan tietynlaisia ohjaustoimintoja.

Tämän mukaisesti määriteltiin Asciin mukaiset kontrollikoodit:

Pos. Name Abbr. Definition
0/10 Format effector 2 (Line feed) FE2 (LF) A format effector which advances the active position to the same character position of the nextline.
0/11 Format effector 3 (Vertical tabulation) FE3 (VT) A format effector which advances the active position to the same character position on the next pre-determined line.
0/12 Format effector (Form feed) FE4 (FF) A format effector which advances the active position to the same character position on the next pre-determined line of the next form or page.
0/13 Format effector (Carriage return) FE5 (CR) A format effector which moves the active position to the first character position on the same line.
C0 Set of ISO 646 (PDF-muotoinen)

Kyseisen tavan ollessa käytössä return- tai enter-näppäimen painallus päätteen tai tietokoneen näppäimistöltä aiheuttaa siis kontrollikoodien CR ja LF tallentumisen ohjelman muistiin taikka tiedostoon. Vastaavasti tekstidatan tulostaminen kuvaruutuun tai paperille aiheuttaa rivinvaihdot kyseisissä kohdissa. Toiminta saattaa jopa olla aivan analogista kirjoituskoneen toiminnan kanssa siinä mielessä, että CR ja LF aiheuttavat ovat kaksi erillistä asiaa: kirjoituskohdan siirto ääriasentoon vasemmalle sekä kirjoituskohdan siirto yhden rivin verran alaspäin. Tällöin pelkän CR:n esiintyminen tekstissä aiheuttaa sen, että sen jälkeinen teksti tulostuu rivillä jo olevan tekstin päälle (päällekirjoitus, overwrite). Vastaavasti pelkkä LF aiheuttaisi jotain seuraavantapaista:

Tässä on tekstiä
                ja tässä se jatkuu alemmalla rivillä.

Toisaalta voidaan ajatella - ja monella taholla ajateltiinkin - että kahden kontrollikoodin käyttö on turhaa, kun yksi riittää. Voidaanhan tulostuslaite tehdä tai ohjelmoida toimimaan halutulla tavalla. Niinpä joissakin järjestelmissä ruvettiin käyttämään pelkkää CR-koodia rivinvaihdon merkkinä, joissakin taas pelkkää LF-koodia. Ongelmia tietysti syntyi, jos dataa siirrettiin järjestelmästä toiseen ja kontrollikoodikäytännöt olivat erilaiset. Mutta tämä tapahtui aikana, jolloin ei juurikaan edes unelmoitu datan joustavasta siirtämisestä eri ohjelmien ja koneiden ja järjestelmien välillä - eikä Internetiä ollut keksittykään. Ja nämä ongelmat olivat sentään aika hyvin hallittavissa verrattuina datansiirron muihin ongelmiin. Dataa tutkimalla selvisi yleensä, mitä rivinvaihtojen esitystä oli käytetty, eikä monitulkintaisuutta syntynyt, koska CR- ja LF-koodeilla ei juuri ollut muuta käyttöä.

Kirjavuutta lisäsi se, että käyttöön otettiin muitakin tapoja esittää rivinvaihdot. Aikoinaan käytettiin paljon reikäkortteja (punched cards). Yhteen korttiin voitiin tallentaa (lävistää) 80 merkkiä, ja oli luonnollista ajatella, että yksi kortti vastaa yhtä riviä. Jos rivi oli lyhyempi kuin 80 merkkiä, jätettiin vain kortin loppuosa käyttämättä. Korteista tietokoneen muistiin tai levylle luettu data tallennettiin yleisesti kortinkuvina (card images), mikä tarkoittaa, että tallennettiin tasan 80 merkkiä korttia kohti käyttäen lopussa tarvittaessa täytemerkkinä välilyöntiä (tyhjää väliä, space, blank). Tällöin mitään rivinvaihtokoodeja ei tarvita. Rivit ovat suoraan peräkkäin eli rivin viimeistä merkkiä seuraa välittömästi seuraavan rivin ensimmäinen merkki. Datan käsittelyssä vain otettiin huomioon, että kukin rivi on tasan 80 merkin mittainen.

Muista tavoista mainittakoon ratkaisu, jossa kutakin riviä edeltää data, joka kertoo rivin pituuden merkkeinä. Tällöinkään ei mitään erillisiä rivinvaihtokoodeja tarvita.

Kappaleiden erottamiseen toisistaan käytetään yleisesti tyhjää riviä etenkin silloin, kun kehittyneempiä menetelmiä ei ole käytettävissä - siis esimerkiksi silloin, kun teksti on "pelkkää tekstiä". Tyhjä rivi tarkoittaa yleensä sitä, että on peräkkäin kaksi rivinvaihtoa. Tosin se saattaa tarkoittaa myös riviä, joka koostuu vain yhdestä tai useammasta välilyöntimerkistä.