Portál AbcLinuxu, 10. května 2024 05:31


Dotaz: setlocale, xterm a luit

15.4.2009 13:24 Rhadesan | skóre: 2
setlocale, xterm a luit
Přečteno: 239×
Odpovědět | Admin

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 :(

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.4.2009 14:45 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: setlocale, xterm a luit
Odpovědět | | Sbalit | Link | Blokovat | Admin

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).

16.4.2009 08:04 Rhadesan | skóre: 2
Rozbalit Rozbalit vše Re: setlocale, xterm a luit

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.
 

16.4.2009 10:31 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: setlocale, xterm a luit

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.

17.4.2009 09:50 Rhadesan | skóre: 2
Rozbalit Rozbalit vše Re: setlocale, xterm a luit

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

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.