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 № 1Você 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árioyyyymmL
(por exemplo,199712L
) Se esse símbolo for definido, todos os caracteres no conjunto necessário Unicode, quando armazenados em um objeto do tipowchar_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