Usando Unicode no código de fonte de C ++

votos
45

O que é a codificação padrão de código fonte C ++? O padrão do C ++ até dizer algo sobre isso? Posso escrever fonte C ++ em Unicode?

Por exemplo, eu posso usar caracteres não-ASCII, tais como caracteres chineses em comentários? Se assim for, é Unicode completa estimação ou apenas um subconjunto de Unicode? (Por exemplo, que a primeira página de 16 bits ou o que é chamado.)

Além disso, posso usar Unicode para cadeias? Por exemplo:

Wstring str=LStrange chars: â Țđ ě €€;
Publicado 01/12/2008 em 19:09
fonte usuário
Em outras línguas...                            


8 respostas

votos
34

Codificação em C ++ é um pouco complicado. Aqui é a minha compreensão.

Cada aplicação tem de suportar os caracteres do conjunto básico de caracteres fonte . Estes incluem os caracteres comuns listados em §2.2 / 1 (§2.3 / 1 em C ++ 11). Todos esses personagens devem caber em um char. Além disso implementações têm de apoiar uma forma de nomear outros caracteres usando um modo chamado universal-character-namese se parecem com \uffffou \Uffffffffe pode ser usado para se referir a caracteres Unicode. Um subconjunto deles são utilizáveis em identificadores (listados no Anexo E).

Isso tudo é bom, mas o mapeamento de caracteres no arquivo, para caracteres de origem (usado em tempo de compilação) é a implementação definida. Esta constitui a codificação usada. Aqui está o que diz literalmente (versão C ++ 98):

caracteres de ficheiro de origem física são mapeados, de uma forma definida na implementação, para o conjunto de caracteres de fonte de base (introdução de caracteres de linha de novo para os indicadores de fim-de-linha), se necessário. sequências Trigraph (2.3) são substituídos pelos correspondentes representações internas de um único caracter. Qualquer personagem arquivo de origem não no conjunto de caracteres fonte básica (2,2) passa a ter a-character-nome universal que des- ignates esse personagem. (Uma implementação pode usar qualquer codificação interna, desde que um caractere estendido reais encontradas no arquivo de origem, e o mesmo caráter prolongado expressa no arquivo de origem como um caracteres nome universal (ou seja, usando a notação \ uXXXX), são tratados equivalentemente.)

Para gcc, você pode alterá-lo usando a opção -finput-charset=charset. Além disso, você pode mudar o caráter de execução usado para represet valores em tempo de execução. A opção adequada para isto é -fexec-charset=charsetpara CHAR (o padrão é utf-8) e -fwide-exec-charset=charset(cujo padrão para qualquer utf-16ou utf-32, dependendo do tamanho de wchar_t).

Respondeu 01/12/2008 em 20:38
fonte usuário

votos
9

Além post de litb, MSVC ++ suporta Unicode também. Eu entendo que recebe a codificação Unicode do BOM. Ele definitivamente suporta código como int (*♫)();ou const std::set<int> ∅; Se você está realmente em obfuscuation código:

typedef void ‼; // Also known as \u203C
class ooɟ {
    operator ‼() {}
};
Respondeu 03/12/2008 em 16:03
fonte usuário

votos
9

padrão do C ++ não diz nada sobre o arquivo de codificação de código-fonte, tanto quanto eu sei.

A codificação é habitual (ou costumava ser) 7 bits ASCII - alguns compiladores (Borland, por exemplo) que se recusam a caracteres ASCII que utilizaram a alta bits. Não há nenhuma razão técnica que os caracteres Unicode não pode ser usado, se o seu compilador e editor de aceitá-los - mais modernas ferramentas baseadas em Linux, e muitos dos melhores editores baseados no Windows, lidar com codificação UTF-8 sem nenhum problema, embora eu não tenho certeza de que compilador da Microsoft vai.

EDIT: Parece que os compiladores da Microsoft aceitará arquivos codificados em Unicode, mas às vezes vai produzir erros em 8-bit ASCII também:

warning C4819: The file contains a character that cannot be represented
in the current code page (932). Save the file in Unicode format to prevent
data loss.
Respondeu 01/12/2008 em 19:26
fonte usuário

votos
6

Há duas questões em jogo aqui. O primeiro é o que caracteres são permitidos em código C ++ (e comentários), tais como nomes de variáveis. A segunda é que os caracteres são permitidos em cordas e strings literais.

Como se observa, compiladores C ++ devem apoiar um conjunto de caracteres baseados em ASCII muito restrito para os caracteres permitidos no código e comentários. Na prática, esse conjunto de caracteres não funcionou muito bem com alguns conjuntos de caracteres europeus (e, especialmente, com alguns teclados europeus que não têm alguns personagens - como colchetes - disponível), então o conceito de dígrafos e trigraphs foi introduzido. Muitos compiladores aceitar mais do que este conjunto de caracteres, neste momento, mas não há nenhuma garantia.

Como para cordas e strings literais, C ++ tem o conceito de uma grande personagem e cadeia de caracteres de largura. No entanto, a codificação para esse conjunto de caracteres é indefinido. Na prática é quase sempre Unicode, mas eu não acho que há qualquer garantia aqui. Largura strings literais personagem parecido com L "string literal", e estes podem ser atribuídos a std :: wstring de.


C ++ 11 adicionou suporte explícito para cadeias Unicode e literais corda, codificados como UTF-8, UTF-16 endian grande, UTF-16 pouco endian, UTF-32 endian grande e UTF-32 pouco endian.

Respondeu 02/12/2008 em 01:14
fonte usuário

votos
3

Para codificação em cordas Eu acho que você está destinado a usar o u \ notação, por exemplo:

std::wstring str = L"\u20AC"; // Euro character
Respondeu 01/12/2008 em 19:26
fonte usuário

votos
2

Neste contexto, se você começar MSVC ++ C4819 de Aviso, basta alterar o arquivo de origem de codificação para "UTF-8 com Bom".

O GCC 4.1 não suporta isso, mas GCC 4.4 faz, e a última versão do Qt usa GCC 4.4, então use "UTF-8 com Bom", como arquivo de origem codificação.

Respondeu 23/08/2012 em 04:10
fonte usuário

votos
2

É importante notar também que caracteres largos em C ++ não são cordas realmente Unicode como tal. Eles são apenas seqüências de caracteres maiores, normalmente 16, mas às vezes 32 bits. Este é definido pela implementação, no entanto, IIRC você pode ter um 8-bit wchar_tVocê não tem nenhuma garantia real quanto para a codificação neles, por isso, se você está tentando fazer algo como processamento de texto, você provavelmente vai querer um typedef para o mais adequado tipo inteiro à sua entidade Unicode.

C ++ 1x tem apoio Unicode adicional sob a forma de literais UTF-8 de cadeia de codificação ( u8"text"), e UTF-16 e UTF-32 tipos de dados ( char16_te char32_tIIRC), bem como as constantes de cadeia correspondentes ( u"text"e U"text"). A codificação de caracteres indicados sem \uxxxxou \Uxxxxxxxxconstantes ainda é definido pela implementação, embora (e não há nenhum suporte de codificação para os tipos de cadeia complexos fora das literais)

Respondeu 01/12/2008 em 20:51
fonte usuário

votos
0

AFAIK Não é padronizado como você pode colocar qualquer tipo de caracteres em seqüências de largura. Você apenas tem que verificar se o seu compilador está definida para o código-fonte Unicode para fazer o trabalho direito.

Respondeu 01/12/2008 em 19:27
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more