3

Greetings,

I'm developing a project in C++ where I want to use characters like á é õ and ┌ ─ ┐ │ to draw a couple of nice frames. My doubt resides in what I should change in my code/project settings since, without any kind of modifications, the console just prints pseudo-random characters.

I know that the above characters are defined in the character set Code page 437 aka Extended ASCII, but what I should do know?

After some research, I included the instruction setlocale(LC_CTYPE, ""); and now I can print accented characters (à é õ) but can't print the borders.

Also, should I use char and string or wchar and wstring to use these characters?

Thanks

James McNellis
357k76 gold badges934 silver badges983 bronze badges
asked Oct 23, 2010 at 22:11
1
  • Your application may be using a specific local. But what local/character encoding is the terminal using to display the characters? Commented Oct 23, 2010 at 22:50

3 Answers 3

2

I think the best way to do it would be to use wchar and wstring for the characters - they are meant for locale-independant string operations and are defined as UTF-16 in Windows and as UTF-32 in Linux.

Note that you need to use the proper functions, for example wprintf instead of printf... If you're using iostream, I think that should work out-of-the-box with wstrings.

EDIT: Note that it is not required for wchar_t to be unicode (in practice, it often is). If wchar_t (and thus, wstring) is unicode, then the C99 standard (and therefore most likely the C++ standard) states that __STDC_ISO_10646__ is to be defined.

In other words, if __STDC_ISO_10646__ is defined, then the wchar_t is unicode -- as for the exact type (UTF-16 or UTF-32), you can use a sizeof(wchar_t).

answered Oct 23, 2010 at 22:15
Sign up to request clarification or add additional context in comments.

5 Comments

In C++ (which is based on C89, not C99), what encoding wchar_t and std::wstring have is an implementation detail, although what you state for Windows/Linux is the common case. For stream IO, use std::wcout, std::wcin etc.
I removed the setlocale(LC_CTYPE, ""); since wchar and wstring are locale-independant. But now, the compiler outputs the error converting to execution character set: Illegal byte sequence with operations like std::wstring maintenance = L"Manutenção"; What's happening?
@sbi: Same goes for C99, it is implementation-dependant - but, as I said __STDC_ISO_10646__ is defined if whatever wchar_t is, is some form of Unicode.
@renatorodrigues: Hm, I'm not sure what could be causing that, to be quite honest... EDIT: Maybe LC_CTYPE also refers to the locale of string literals? As in, the current locale you're editing with. That's more or less a wild guess though.
IIUC, __STDC_ISO_10646__ is a C99 macro. It might be defined by a C++ compiler, but doesn't have to, because C++ doesn't officially know about C99.
0

Try using wchar_t

answered Oct 23, 2010 at 22:19

Comments

0

To see which Unicode characters to use look up http://unicode.org/charts/ and search for "Box Drawing". That set includes the characters that are in CP 437, but also many others. Next question is whether your device can show some or all of these.

answered Oct 24, 2010 at 18:33

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.