Qual é a função do tipo primitivo wchar_t?

1. Qual é a função do tipo primitivo wchar_t?

Lawless Valey
NullKr4ck

(usa Outra)

Enviado em 25/12/2015 - 15:44h

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?


  


2. Re: Qual é a função do tipo primitivo wchar_t?

M.
XProtoman

(usa Fedora)

Enviado em 26/12/2015 - 03:55h

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

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]


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.

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.

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.

Se puder depois relate suas descobertas, boa noite e fique com Deus.


3. Re: Qual é a função do tipo primitivo wchar_t?

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/12/2015 - 04:08h

Como ficaria o printf() do wchar_t?

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



4. Re: Qual é a função do tipo primitivo wchar_t?

M.
XProtoman

(usa Fedora)

Enviado em 26/12/2015 - 04:50h

listeiro_037 escreveu:

Como ficaria o printf() do wchar_t?

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden

Boa noite,

Segue um exemplo:
#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main()
{
setlocale(LC_ALL, "pt_BR.UTF-8");
wchar_t texto[] = L"ÁLGÔ MÚïTÕ È&#346;T&#340;ANHÓ Ê&#7742; UTF-8";
fwprintf(stdout, L"%ls\n", texto);
return 0;
}


Resultado(notei que o fórum não vai exibir corretamente esses caracteres):
$ gcc -std=c11 -pedantic-errors teste.c -o teste.run
$ ./teste.run
ÁLGÔ MÚïTÕ È&#346;T&#340;ANHÓ Ê&#7742; UTF-8



Tive que definir o locale para que os caracteres sejam exibidos corretamente.

Note que antes de toda representação de string em wchar_t você tem que usar o prefixo L, então:
wchar_t nome[] = L"Joana"; 


Da mesma forma que todo caractere você precisa adicionar o prefixo L:
wchar_t nome_caractere = L'Ç'; 


O fwprintf e outros fazem parte daquele link de várias funções do wchar.h. O man do fwprintf também ajuda a clarear as coisas(é bem curto).


5. Re: Qual é a função do tipo primitivo wchar_t?

M.
XProtoman

(usa Fedora)

Enviado em 26/12/2015 - 04:57h

Para complementar, eu tinha usado o fwprintf, para usar o fprintf segue o exemplo abaixo com poucas mudanças que até ajudam a compreender algumas coisas:
#include <stdio.h>
#include <locale.h>
#include <wchar.h>

wchar_t nome[] = L"Joana";
wchar_t nome_caractere = L'Ç';

int main()
{
setlocale(LC_ALL, "pt_BR.UTF-8");
wchar_t texto[] = L"ÁLGÔ MÚïTÕ È&#346;T&#340;ANHÓ Ê&#7742; UTF-8";
//fwprintf(stdout, L"%ls\n", texto);
fprintf(stdout, "%ls", texto);
return 0;
}


PS: A mensagem que escrevi na string texto é simplesmente "ALGO MUITO ESTRANHO EM UTF-8" usando caracteres acentuados.


6. Re: Qual é a função do tipo primitivo wchar_t?

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/12/2015 - 05:14h

Matou a pau. Valew!

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



7. Re: Qual é a função do tipo primitivo wchar_t?

Lawless Valey
NullKr4ck

(usa Outra)

Enviado em 26/12/2015 - 16:06h

Aí sim em, vou fazer uns testes com esse algoritimo


8. Re: Qual é a função do tipo primitivo wchar_t?

Paulo
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



  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts