#include <stdio.h>
// Pienen "ä" -kirjaimen tulostus komentorivisovelluksissa:
// samalla esimerkki siitä, miten C -kielen main() -funktion voi uudelleenohjata mainwork() -funktioon.
typedef char * PAnsiChar;
typedef PAnsiChar * PPAnsiChar;
void printAE(void) {
printf("\x84"); // merkin "ä" koodi koodisivuilla 437 tai 850 on 0x84. (132)
// koodit sivulla 437: https://en.wikipedia.org/wiki/Code_page_437
}
int mainwork(int argc, PPAnsiChar argv) {
//
printf("Argumenttien lukum");
printAE(); printAE();
printf("r");
printAE();
printf(": %d", argc);
return 0;
}
int main(int argc, PPAnsiChar argv) {
return mainwork(argc, argv);
}
ä -kirjain komentorivisovelluksissa JA main() -funktion voi uudelleenohjaus
7
1464
Vastaukset
- Anonyymi
em. kirjoituksessa on ollut kyse NIMENOMAAN ohjelmoinnista Windowsille (linuxille on sitten omat juttunsa: nykylinuxeissa komentorivisovellusten merkkikoodaus on UTF-8 -enkoodattu UNICODE; vanhoissa linuxeissa kuten debian sarge, komentorivisovellusten merkkikoodaus on ISO-8859-1).
Tietenkin em. koodia voisi muokata korvaamalla rivin:
printf("\x84"); // merkin "ä" koodi koodisivuilla 437 tai 850 on 0x84. (132)
esim. näin:
#ifdef mswindows
printf("\x84"); // merkin "ä" koodi koodisivuilla 437 tai 850 on 0x84. (132)
#endif
#ifdef old_linux
printf("\xE4"); // merkin "ä" koodi koodisivuilla ISO 8859-1 on 0xE4. (228)
#endif
#ifdef new_linux
printf("\xC3\xA4"); // merkin "ä" enkoodus esitystavalla UTF-8 on 0xC3 0xA4.
// huom: "ä" enkoodattuna UTF-8 on siis 2- tavuinen: 0xC3 0xA4.
#endif
Lainaus:
printf("\x84"); // merkin "ä" koodi koodisivuilla 437 tai 850 on 0x84. (132)
Täsmennys:
Tuossa linkatussa taulukossa (Web: Code page 437)
ruudussa "ä" on seuraavat tiedot:
ä = tulostuva merkki
00E4 = vastaava UNICODE -koodi (joka EI OLE olennainen tässä asiassa; mainittu vain referenssinä)
132 = merkin "ä" koodi koodisivulla 437 esitettynä 10 -järjestelmässä, eli vastaa heksadesimaalikoodia 0x84.
Web -sivun ( https://en.cppreference.com/w/cpp/language/escape ) mukaan:
Vastaavaa numeerista tapaa 10 -järjestelmän mukaan kirjoitetuille merkkikoodeille ei C -kielen standardissa ole, vaan voit valita joko heksadesimaalikoodin (suositeltava) tai vaihtoehtoisesti oktaalikoodin (käytä vain, jos on olemassa erityinen syy käyttää sitä heksadesimaalikoodin sijasta).
Lainaus em. sivulta:
Numeric escape sequences
\nnn arbitrary octal value byte nnn
\xnn arbitrary hexadecimal value byte nn
Toivottavasti tämä tuo selkeyttä siihen, miten komentorivisovellus saadaan näyttämään myös "ä" -kirjain oikein.- Anonyymi
Kysymys oikeasti kokeneille C -koodareille:
Onko olemassa jokin keino, miten tämän voisi toteuttaa:
int check_character_encoding(void) {
int the_Encoding;
// the_Encoding = ????
return the_Encoding;
}
ylläolevan funktion pitäisi palauttaa:
437, jos komentorivisovellusten koodisivu on 437
850, jos komentorivisovellusten koodisivu on 850
8859, jos komentorivisovellusten koodisivu on 8859-1
65001, jos komentorivisovellusten koodisivu on UTF-8
-1, jos ohjelma ei kykene automaattisesti tunnistamaan käytettyä komentorivisovellusten koodisivua.
windowsin / linuxin voisi ehkä yrittää tunnistaa siitä, että jos printtaa merkkijonoon
"\n", niin tuleeko 1 merkki (LF, linuxissa) vai 2 merkkiä (CR ja LF, windowsissa).
kirjastoja (DLL / .so) voisi ladata vain dynaamisesti (windowsissa LoadLibrary),
jos ei olla varmoja, mitä kirjastoja on saatavilla.
- Anonyymi
Ei ole kysymys mistään uudelleen ohjaamisesta, vaan tämä on komentoriviparametrin välitys esimerkki, joka näyttää kuinka komentoriviparametri välitetään C-ohjelmassa, ali-funktiolle.
- Anonyymi
Tuo on oikeastaan editorin ominaisuus ja käytetyn terminaalin/konsolin asetus. Kääntäjä ei tiedä mitään koodauksista sinänsä, mutta lukee lähdekoodia sisäänsä asetetussa koodauksessa.
Esimerkiksi emacs:ssa voi kooditiedoston tallettaa utf-8 muodossa normaalisti, mutta jos on tarvetta iso-8859-1 koodaukselle, sen saa klikkaamalla esim. status-rivin U-kirjainta hiiren 2-napilla ja valitsemalla talletusformaatin. Tällä tavalla toimimalla saa tiedoston pidettyä myös siististi oikeassa formaatissa, koska editori osaa näyttää erikoismerkit/koodauksen oikein.
Helpoin tapaus eli utf-8 terminaali, utf-8 kooditiedosto ja emacs utf-8 moodissa(oletus): Kaikki toimii oikein! Terminaalin asettaminen käännöksen jälkeen iso-8859-1:ksi kuitenkin rikkoo tällöin merkistön. Pitää siis saada tiedosto oikeaan formaatiin: M-x recode-region on oikea komento tähän emacsissa. Käännöksen jälkeen ääkköset eivät näy utf-8 terminaalissa (välttämättä) oikein, ennen kuin sen enkoodaus on myöskin vaihdettu.
Ja jos lennossa tarvitsee eri koodauksia tukea, niin iconv on ainakin yksi työkalu tällaiseen.
Pienenä anekdoottina: 20-vuotta sitten kirjoittamani tekstipohjainen ohjelma toimii yhä edelleen oikein, mutta tuotettu binääri tuottaa nykyään kääntäjällä oletuksena utf-8 koodausta, kun se aikaisemmin tuotti iso-8859-1:tä. Toisin sanoen, ohjelma ei ole muuttunut, mutta ympäristö on järjettömän erilainen, missä sitä ajetaan ja mahdollistaa vaikkapa japaninkieliset kirjoitusmerkit nykyään!- Anonyymi
Kyllä sinä olet vainunnut asian ytimen oikein, mutta monisanaisuutesi vuoksi, asiaan jää epäily, ettet olisi ymmärtänyt kysymystä ollenkaan.
Tämä sama ajatus, järjestelmän oletuksista yltää kaikkeen. Mikäli et Lazarus sovelluksessa erikseen määrittele sovelluksen taustaväriä, käytetään järjestelmän oletusta ja näin menetellen piirretään koko sovelluksen käyttöliittymä kuten myös käytetty koodisivu.
Näitä yleisiä siirrettävyyteen liittyviä sääntöjä, GNOME rikkoo tahallisesti, jossa systemaattinen järjestys korvataan kaaoksen omaisella epäjärjestyksellä. Odottelen milloin ne päättää vaihtaa kirjaimien paikkaa keskenään, luodakseen jotain muista poikkeavaa.
- Anonyymi
Tuollaisia jutyujs: ;Master Bppt Record )MBR), paritition type is unknonwn propaplyy RAW an encodeded with some jokeu... Star Generator 2.0 :D
- Anonyymi
Kaikkien olemassa olevien ongelmiesi lisäksi, sinulla on pahoja sopeutumisvaikeuksia, eivätkö vanhempasi aio tehdä asialle mitään.
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
- 2024208
SDP haluaa 40 000 nettomaahanmuuttajaa
SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah1463768Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen
No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat823126Hienoa! Eduskunta luopui käteisen käytöstä
Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.431579Ikävä sinua mies
Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i191418Sulla on avaimet ja keinot
Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi241360Mikä tämä henkilö mahtaa touhuta Parkanossa
Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58321357Orpo loukkaantui fasismiin viittaavasta sanavalinnasta
Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk271341Kiinnostaa - ei kiinnosta - kiinnostaapas
Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt1151128Martina haluaa Marbellaan
Martinan tekisi mieli ottaa lennot Marbellaan, jossa näkisisi kauniita ja hyväntuulisia ihmisiä. No sitten pitää matkust2151053