/ / c ++: obtendo o valor ascii de um grande caractere - c ++, c, ascii, multibyte

c ++: obtendo o valor ascii de um caractere largo - c ++, c, ascii, multibyte

digamos que eu tenha uma matriz de caracteres como "äa". Existe uma maneira de obter o valor ASCII (por exemplo, 228) do primeiro caractere, que é um multibyte? mesmo que eu lance meu array para um array wchar_t *, eu não sou capaz de obter o valor ascii de "ä", porque tem 2 bytes de comprimento. existe uma maneira de fazer isso, estou tentando por 2 dias agora :(

Eu estou usando o gcc.

obrigado!

Respostas:

4 para resposta № 1

Você está se contradizendo. Personagens internacionais como ä são (por definição) não dentro o conjunto de caracteres ASCII, para que eles não tenham um "valor ascii".

Depende da codificação exata da sua matriz de dois caracteres, se você pode obter o ponto de código para um único caractere ou não, e em caso afirmativo, em que formato ele estará.


2 para resposta № 2

Você está muito confuso. ASCII tem apenas valores menores que 128. O valor 228 corresponde a ä em conjuntos de caracteres ISO 8859-1, CP1252 e outros. Também é o valor UCS de ä no sistema Unicode. Se você usar string literal "ä" e obter uma string de dois caracteres, a string é de fato codificada em utf-8 e você pode querer analisar a codificação utf-8 para adquirir valores Unicode UCS.

Mais provavelmente o que você realmente quer fazer éconvertendo de um conjunto de caracteres para outro. Como isso depende muito do seu sistema operacional, portanto, mais informações são necessárias. Você também precisa especificar o que exatamente você quer? Um std :: string ou char * de ISO-8859-1, talvez?


1 para resposta № 3

Existe uma função padrão de modelo C ++ para fazer essa conversão, ctype :: narrow (). Faz parte do biblioteca de localização. Ele irá converter o caractere largo para ovalor de char equivalente para você atual local, se possível. Como as outras respostas apontaram, nem sempre existe um mapeamento, e é por isso que ctype :: narrow () usa um caractere padrão que retornará se não houver mapeamento.


1 para resposta № 4

Depende da codificação usada em sua matriz de caracteres.

Se sua matriz char é codificada em latim 1, então ela tem 2 bytes de comprimento (mais talvez um terminador NUL, nós não nos importamos), e esses 2 bytes são:

  • 0xE4 (minúscula um trema)
  • 0x61 (minúscula a).

Observe que o Latin 1 não é ASCII e 0xE4 não é um valor ASCII, é um valor Latin 1 (ou Unicode).

Você obteria o valor assim:

int i = (unsigned char) my_array[0];

Se a sua matriz de caracteres é codificada por utf-8, ela tem três bytes de comprimento e esses bytes são:

  • binário 11000011 (primeiro byte de 0xE4 codificado por utf-8)
  • binário 10100100 (segundo byte do 0xE4 codificado em utf-8)
  • 0x61 (minúscula a)

Para recuperar o valor Unicode de um caractere codificado com utf-8, você precisa implementá-lo com base em http://en.wikipedia.org/wiki/utf-8#Description (geralmente uma má idéia no código de produção), ou então você precisa usar uma rotina de conversão unicode-para-wchar_t específica da plataforma. No linux isso é mbstowcs ou iconv, embora para um único personagem você possa usar mbtowc desde que a codificação multi-byte definida para a localidade atual seja de fato utf-8:

wchar_t i;
if (mbtowc(&i, my_array, 3) == -1) {
// handle error
}

Se é SHIFT-JIS então isso não funciona ...


0 para a resposta № 5

o que você quer é chamado de transliteração - convertendo letras de um idioma para outro. não tem nada sobre unicode e wchars. você precisa ter uma tabela de mapeamento.