Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Unicode w GCC

16 views
Skip to first unread message

Piotr Wyderski

unread,
Aug 15, 2008, 6:48:24 AM8/15/08
to
Witam,

w jaki sposób zmusić GCC (używam 4.2.3 i właśnie buduję 4.3.1) do
pracy w trybie Unicode? Gdy w programie napiszę:

#include <iostream>

std::wcout << 3;

to kompilator narzeka na niezdefiniowany w std obiekt wcout.
Gdy w programie przed inkludami dodam _GLIBCXX_USE_WCHAR_T, to
dostaję całą masę błędów z gieckowych inkludów.

Pozdrawiam
Piotr Wyderski

Marcin ‘Qrczak’ Kowalczyk

unread,
Aug 15, 2008, 9:24:36 AM8/15/08
to
On 15 Sie, 12:48, "Piotr Wyderski" <wyder...@mothers.against.spam-
ii.uni.wroc.pl> wrote:

> Gdy w programie napiszę:
>
>     #include <iostream>
>
>     std::wcout << 3;
>
> to kompilator narzeka na niezdefiniowany w std obiekt wcout.

U mnie działa (gcc-4.2.3 z Ubuntu Hardy).

_GLIBCXX_USE_WCHAR_T jest zdefiniowane w /usr/include/c++/4.2/x86_64-
linux-gnu/bits/c++config.h

Maciej Oblaza

unread,
Aug 15, 2008, 1:57:10 PM8/15/08
to

IMHO u mnie ładnie działa na gcc 4.1.2 ponizszy przykład


#define _GLIBCXX_USE_WCHAR_T
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int
main()
{
locale loc("pl_PL.UTF-8");
setlocale(LC_ALL, "pl_PL.UTF-8");
locale::global(loc);
wcout.imbue(loc);
wcin.imbue(loc);
const wchar_t* ptr=L"ółążźśćę";
wstring s1, s2(L"óółłąążżźźśśęę");
wcout<<ptr<<endl;
wcout<<s2<<endl;
wcin>>s1;
wcout<<s1<<endl;
return (0);
}

pozdrawiam.

--
All the best,
moblaza at gmail dot com

Piotr Wyderski

unread,
Aug 16, 2008, 4:47:56 AM8/16/08
to
Marcin 'Qrczak' Kowalczyk wrote:

> U mnie działa (gcc-4.2.3 z Ubuntu Hardy).

A u mnie na Cygwinie (32-bitowy WinXP) nie działa. Nie wiem
tylko, czy to jest ogólna przypadłość Cygwina, czy też może ja
źle zbudowałem kompilator, bo natywnie jest staruteńki 3.4...
4.3.1 mi się nie polinkowało z najnowszym MPFR.

Pozdrawiam
Piotr Wyderski

ZikO

unread,
Aug 24, 2008, 11:56:11 AM8/24/08
to

U mnie ten przykład się nie kompiluje. Właśnie zainstalowałem
gcc-4.3.0-20080502-mingw32-alpha (wzasadzie nadpisałem go na
istniejącego gcc-3.4.5.xxx) i spróbowałem, ale kompilator pisze:

testWstring.cpp:15: error: converting to execution character set:
Illegal byte sequence
testWstring.cpp:16: error: converting to execution character set:
Illegal byte sequence

dokładnie tam gdzie umieszczone są polskie znaki z długimi tekstami.

Marcin 'Qrczak' Kowalczyk

unread,
Aug 24, 2008, 4:29:47 PM8/24/08
to
On 24 Sie, 17:56, ZikO <ze...@op.pl> wrote:

> testWstring.cpp:15: error: converting to execution character set:
> Illegal byte sequence
> testWstring.cpp:16: error: converting to execution character set:
> Illegal byte sequence
>
> dokładnie tam gdzie umieszczone są polskie znaki z długimi tekstami.

To znaczy, że plik używa innego kodowania, niż zakłada gcc (albo że
gcc zakłada, że przez wykonujący się program będzie używany taki
zestaw znaków, w którym nie można zapisać tego tekstu, ale w domyślnej
konfiguracji to niemożliwe, bo gcc zakłada tutaj UTF-8).

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
Zobacz opcje z "charset" w nazwie.

Pod Linuxem normalne byłoby ustawienie locale z zestawem znaków
pasującym do źródła, ale nie wiem, jak wyglądają locale pod Windows.

ZikO

unread,
Aug 25, 2008, 7:08:12 AM8/25/08
to
> To znaczy, że plik używa innego kodowania, niż zakłada gcc (albo że
> gcc zakłada, że przez wykonujący się program będzie używany taki
> zestaw znaków, w którym nie można zapisać tego tekstu, ale w domyślnej
> konfiguracji to niemożliwe, bo gcc zakłada tutaj UTF-8).
>
> http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
> Zobacz opcje z "charset" w nazwie.
>
> Pod Linuxem normalne byłoby ustawienie locale z zestawem znaków
> pasującym do źródła, ale nie wiem, jak wyglądają locale pod Windows.

Znalazlem cos takiego w internecie:
`-fexec-charset=CHARSET'
Set the execution character set, used for string and character
constants. The default is UTF-8. CHARSET can be any encoding
supported by the system's `iconv' library routine.

`-fwide-exec-charset=CHARSET'
Set the wide execution character set, used for wide string and
character constants. The default is UTF-32 or UTF-16, whichever
corresponds to the width of `wchar_t'. As with
`-ftarget-charset', CHARSET can be any encoding supported by the
system's `iconv' library routine; however, you will have problems
with encodings that do not fit exactly in `wchar_t'.

`-finput-charset=CHARSET'
Set the input character set, used for translation from the
character set of the input file to the source character set used
by GCC. If the locale does not specify, or GCC cannot get this
information from the locale, the default is UTF-8. This can be
overridden by either the locale or this command line option.
Currently the command line option takes precedence if there's a
conflict. CHARSET can be any encoding supported by the system's
`iconv' library routine.

ale przyznam sie ze nie wiem jak tego uzyc :/// tzn. czy podczas
kompilacji mam ustawic charset na taki jaki uzywam w komputerze i nie
wiem ktora z tych opcji mialbym uzyc. tzn, czy mam zrobic cos takiego:

-fwide-exec-charset=Windows-1250

Pozdrawiam.


Pozdrawiam.

0 new messages