paulo1205
(usa Ubuntu)
Enviado em 27/12/2015 - 01:55h
XProtoman escreveu:
NullKr4ck escreveu:
Não sei a função do tipo primitivo wchar_t. Qual é a função dele e como se deve ser usado em um programa? E por que alguns autores não o consideram como um tipo primitivo?
Boa noite,
Alguém dará uma resposta melhor do que a minha.
Tinha feito uma resposta bem grande sobre algumas coisas do wchar_t porém na hora que fui postar o site bugou e tudo foi perdido, mas nem se preocupe que não eram respostas diretas. Vou resumir algumas coisas.
wchar_t aparentemente tem seu tamanho variável:
Both C and C++ introduced fixed-size character types char16_t and char32_t in the 2011 revisions of their respective standards to provide unambiguous representation of 16-bit and 32-bit Unicode transformation formats, leaving wchar_t implementation-defined. The ISO/IEC 10646:2003 Unicode standard 4.0 says that:
"The width of wchar_t is compiler-specific and can be as small as 8 bits. Consequently, programs that need to be portable across any C or C++ compiler should not use wchar_t for storing Unicode text. The wchar_t type is intended for storing compiler-defined wide characters, which may be Unicode characters in some compilers."
Fonte:
https://en.wikipedia.org/wiki/Wide_character
Por outro lado, o padrão do C++ prescreve que o tipo deve ser de um tamanho suficiente para representar qualquer caráter que possa ser exibido pelo sistema. Além disso, ao contrário do C, em C++
wchar_t é um tipo fundamental, cuja definição não depende de <cwchar> ou <wchar.h>.
Comecei a usar o wchar_t por perceber que char não tinha tamanho suficiente para trabalhar com UNICODE em algumas operações, exemplo um "ç" é usa mais de um char para ser representado, a prova é você fazer algo como:
char caractere = 'ç';
Seu compilador provavelmente te dirá(resultado do GCC abaixo):
warning: multi-character character constant [-Wmultichar]
Isso depende muito das condições que você estiver usando. Faz tempo que eu não mexo com Windows, especialmente para programar, mas, até onde me lembro, tanto em Português como em Inglês, o conjunto de caracteres padrão é de 8 bits (Code Page 1252, que é uma adaptação do ISO-8859-1, mas que sobrepõe caracteres imprimíveis na faixa que vai de 128 a 159, que abriga caracteres de controle tanto no ISO-8859-1 quanto no Unicode), e os arquivos de texto, incluindo código fonte de programas em C, por padrão também trabalhavam com caracteres de 8 bits. Mesmo no mundo UNIX e Linux, pode-se configurar o sistema para trabalhar por padrão com caracteres de oito bits (não é mais o default nas distribuições de Linux de hoje, mas foi durante um bom tempo). Em casos como esses, o “ç” usado no seu exemplo ainda seria exibido como um caráter só na tela, e ocuparia um byte só no arquivo, e o compilador não mostraria mensagem alguma.
Provavelmente, quando você fez o teste acima, você estava em um sistema configurado para trabalhar com UTF-8. Por estar configurado assim, ele gerou um arquivo em que o “ç”, cujo índice Unicode é 231 (e também ISO-8859-1 e WIndows CP-1252), é codificado no UTF-8 através de dois bytes, com os valores 195 e 167. Em C, o seu código ficou funcionalmente equivalente ao seguinte.
char caractere='\303\247';
No próprio GCC existe um parâmetro que pode alterar o tamanho do wchar_t que é o -fshort-wchar porém não o use, não tem utilidade para maior parte das pessoas e projetos, é só um exemplo que o tamanho pode variar.
Talvez tenha. Pelo que li, no Windows se utiliza
wchar_t com largura de 16 bits por padrão. O Java também, pelo que me lembro, utiliza dois bytes para representar nativamente aquilo que ele chama de
char. Imagino que um módulo em C ou C++ que vá fazer interface com Java possa preferir um
wchar_t de 16 bits, portanto.
O que vou falar agora é uma suposição: Sobre não ser um tipo primitivo talvez se deva ao fato de você ter que incluir o wchar.h para poder trabalhar com wchar_t.
Depende da linguagem. Em C,
wchar_t é geralmente um
typedef para algum outro tipo inteiro, e realmente requer o uso de <wchar.h>. Em C++, por outro lado,
wchar_t é um tipo primitivo funcionalmente distinto de qualquer outro tipo inteiro, mesmo que tenha o mesmo tamanho e representação interna que algum deles.
O tipo tem de ser distinto para que funcionem corretamente a programação genérica e as operações polimórficas em que o tipo de dado influencie no comportamento da operação (como entrada e saída com os operadores
>> e
<< -- ninguém iria gostar se
std::cout << L'ç';
imprimisse “231” em vez de “ç”, por exemplo). Esse tipo nativo não depende de <cwchar>, e o usuário só precisará incluir esse cabeçalho se quiser usar alguma das funções que estejam nele declaradas.
wchar_t é interessante porque tem várias funções para trabalhar com ele como você teria para char em strings, segue um link com várias funções do wchar.h(lembre-se de incluí-lo quando for trabalhar com wchar_t):
http://pubs.opengroup.org/onlinepubs/007908775/xsh/wchar.h.html
Para a interpretação do nome das funções note que wcslen cumpre o mesmo papel de strlen só que para wchar_t, wcsncpy que o strncpy e por ai vai.
Existem outras alternativas para se trabalhar com UNICODE como o char16_t e char32_t, que ainda não uso, mas pelo nome já da para perceber que ambos tem tamanho fixo definido, porém em C não encontrei funções(da biblioteca padrão) para trabalhar com strings deles como existe no caso de wchar_t.
Esses tipos do C++ têm aplicações específicas, servindo para representar texto em Unicode codificado, respectivamente, em UTF-16 e UTF-32 (cf.
https://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals). Assim como
wchar_t, esses também são tipos nativos em C++ (em C são
typedefs), e o uso de <cuchar> (derivado de <uchar.c> do C) não importa os
typedefs do C, mas somente as funções para trabalhar com dados desses tipos (essencialmente conversão de/para sequência de bytes).
Se puder depois relate suas descobertas, boa noite e fique com Deus.
Acho interessantes alguns artigos na WIkipedia, além do que já indiquei acima:
*
https://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings
*
https://en.wikipedia.org/wiki/UTF-8
*
https://en.wikipedia.org/wiki/UTF-16
*
https://en.wikipedia.org/wiki/UTF-32