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 № 1Você 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.