Portál AbcLinuxu, 12. května 2025 06:05
Ahoj!
Chtel bych se zeptat, jak mam nastavit xterm tak, aby mi nasleduji program vypsal pismeno Č:
#include <iostream>
using namespace std;
int main()
{
char ch = 200; // v ISO 8859-2 je to velke pismeno C s hackem
cout.imbue(std::locale("cs_CZ.iso88592"));
cout << ch << "\nKonec programu" << endl;
} // main
Pokud spustim xterm takto: xterm -en ISO8859-2 tak vse funguje jak ma, ja bych ho vsak chtel spustit s parametrem -lc a nejakym zpusobem ho donutit, aby vypisoval co potrebuju, coz se ne a ne povest.
PS: Nevim vubec jak ma luit, potazmo option -lc fungovat; co jsem koukal, tak by to melo fungovat tak, ze podle toho jake nastavim LOCALE v programu, tak podle toho se automaticky nastavi terminal tak, aby se vse vypisovalo dle daneho locale? Je to tak? Z dokumentace luit nejsem prilis moudry :(
Nevím, co všechno dělá std::cout.imbue(), ale luit potřebuje předem znát kódování, v kterém poběží program.
Mně LANG=cs_CZ.iso8859-2 xterm -hold -lc -e /tmp/a.out
funguje (kde /tmp/a.out je váš program).
A muzu tedy nejak pri behu programu luitu dat vedet, ze ted chci pouzit (jine) konkretni kodovani? Potrebuji tuto zmenu totiz provest z vlastniho programu. Toto zmenu tedy potrebuji provest az potom, co je terminal spusten.
Asi by to mělo jít přes ISO 2022 escape sekvence, jak tvrdí luit(1) a demonstrace s Emacsem.
Nicméně v praxi jsem to viděl jen u východoasijských znakových sad, kde se takto přepíná mezi latinkou a jejich dvoubajtovým písmem. Tam se ale pouze přepíná mezi dvěma implicitně danými sadami a tak se vysílá jen „přepni tam“ a „přepni zpět“, nikoliv „přepni do ISO-8859-1“.
Z vašeho programu se mi nepodařilo tyto sekvence dostat:
$ ./a.out |hexdump -C 00000000 c8 0a 4b 6f 6e 65 63 20 70 72 6f 67 72 61 6d 75 |È.Konec programu| 00000010 0a |.| 00000011
Před prvním bajtem 0xC8 ('Č' v ISO-8859-2) by měla být ta přepínací sekvence.
Diky za nasmerovani, bohuzel mi to i s prepnutim nefunguje. Mirne upraveny program:
#include <iostream>
using namespace std;
int main()
{
char ch = 200; // v ISO 8859-2 je to velke pismeno C s hackem
cout.imbue(std::locale("cs_CZ.iso88592"));
cout << "\033-B" << ch << "\nKonec programu" << endl;
} // main
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.