/ / wcstombs: codificação de caracteres? - c, codificação de caracteres

wcstombs: codificação de caracteres? - c, codificação de caracteres

wcstombs documentação diz, "converte a sequência de códigos de caracteres largos em seqüência de vários bytes". Mas nunca diz o que é um "caráter amplo".

Está implícito, como digamos, que converte utf-16 em utf-8 ou a conversão é definida por alguma variável de ambiente?

Além disso, qual é o caso de uso típico de wcstombs?

Respostas:

4 para resposta № 1

Você usa o setlocale() função padrão com o LC_CTYPE (ou LC_ALL) para definir o mapeamento que a biblioteca usa entre wchar_t caracteres e caracteres multibyte. O nome da localidade real passado para setlocale() é uma implementação definida, então você precisará procurá-lo nos documentos do seu compilador.

Por exemplo, com o MSVC você pode usar

setlocale( LC_ALL, ".1252" );

para configurar o tempo de execução C para usar a página de códigos 1252 como o conjunto de caracteres multibyte. Observe que os documentos do MSVC indicam explicitamente que o código do idioma não pode ser definido como UTF-7 ou UTF8 para os conjuntos de caracteres multibyte:

O conjunto de idiomas disponíveis, país / regiãocódigos e páginas de código inclui todos os suportados pela API Win32 NLS, exceto páginas de código que exigem mais de dois bytes por caractere, como UTF-7 e utf-8. Se você fornecer uma página de código como UTF-7 ou utf-8, o setlocale falhará, retornando NULL.

O "caractere amplo" wchar_t O tipo pretende suportar qualquer conjunto de caracteres que o sistema suporte - o padrão não define o tamanho de um wchar_t tipo (pode ser tão pequeno quanto um char ou qualquer um dos tipos inteiros maiores). No Windows, é a codificação Unicode "interna" do sistema, que é UTF-16 (UCS-2 antes do WinXP). Honestamente, não consigo encontrar uma citação direta sobre isso nos documentos da MSVC. Estritamente falando, a implementação deve chamar isso de destaque, mas não consigo encontrá-lo.


3 para resposta № 2

Ele converte o que sua plataforma usa para um"wide char" (que eu acredito que seja realmente o UCS2 no Windows, mas geralmente é o UCS4 no UNIX) na codificação de caracteres multibyte padrão do seu local atual. Se o seu código do idioma for utf-8, essa é a codificação multibyte que será usada - mas observe que existem outras possibilidades, como o JIS.


1 para resposta № 3

De acordo com o padrão C, wchar_t type é "capaz de representar qualquer caractere no código do idioma atual". O padrão não diz para que serve a codificação wchar_t é. De fato, os limites de WCHAR_MIN e WCHAR_MAX são [0, 255] ou [-127, 127], dependendo se wchar_t está sem sinal ou assinado.

Um caractere multibyte pode usar mais de um byte. Uma sequência multibyte é composta por um ou mais caracteres multibyte. Em uma sequência multibyte, cada caractere não precisa ter o mesmo número de bytes (utf-8 é um exemplo). Considerando que um objeto do tipo wchar_t tem um tamanho fixo (em uma determinada implementação, é claro).

Além disso, também posso encontrar o seguinte em minha cópia do rascunho do C99:

__STDC_ISO_10646__ Uma constante inteira do formulário yyyymmL (por exemplo, 199712L) Se esse símbolo for definido, todos os caracteres no conjunto necessário Unicode, quando armazenados em um objeto do tipo wchar_t, tem o mesmo valor que o identificador curto deesse personagem. O conjunto necessário Unicode consiste em todos os caracteres definidos pela ISO / IEC 10646, juntamente com todas as emendas e correções técnicas, a partir do ano e mês especificados.

Então, se eu entendi direito, se __STDC_ISO_10646__ é definido, então wchar_t pode armazenar caracteres Unicode.


1 para resposta № 4

Seqüências de caracteres largas são compostas de bytes múltiploscaracteres, enquanto a string C normal é um caractere * - uma sequência de caracteres em todo o byte. Wchars não são a mesma coisa que unicode em todas as plataformas, embora representações unicode sejam tipicamente baseadas em wchar_t

Eu vi wchars usados ​​em sistemas embarcados, como telefones, nos quais você deseja nomes de arquivos com caracteres especiais, mas não necessariamente suporta toda a glória e complexidade do unicode.

O uso típico seria converter uma string baseada em 2 bytes em uma string C regular e vice-versa