Esmiuçando operadores bit-a-bit - Parte 2
Esta é sem dúvida uma coisa que deve ser levada em consideração na hora de trabalhar com operadores bit-a-bit em caracteres. Na verdade nem é uma coisa ruim, muito pelo contrário, o PHP parece entender o que eu quero que ele faça e age da forma que eu gostaria que ele funcionasse.
Se você reparar na tabela ASCII postada na primeira página, vai reparar que as letras equivalentes entre maiúsculas e minúsculas só têm a relação (diferença de 32) entre os caracteres normais (sem acentos). Parece que os outros caracteres foram simplesmente jogados ali de forma aleatória.
Pra vocês conseguirem visualizar melhor, pegue qualquer letra com acento, “á” (ASCII 160) por exemplo e siga a lógica utilizada lá na primeira página. Converta para binário esse 160 (10100000) e então compare com o espaço utilizando o esquema do operador “^” (que eu usei pra passar de minúscula para maiúscula):
Como você pode reparar ali, chegamos ao valor 128, que não tem nada a ver com o valor ASCII de “Á” (a letra maiúscula relativa de “á”), mas sim, é um “Ç”. Agora faça um teste usando o PHP, pegue esse caractere “á” e compare com o espaço usando o operador “^”.
O que aconteceu? Apareceu “Á” e não “Ç”. Não está entendendo mais nada? Pois agora você vai entender menos ainda. Vamos novamente ao PHP, atribua o valor, usando o operador, à uma variável assim como eu fiz ali em cima, e use a função do PHP que imprime o valor ASCII: ord():
Imprimiu 193, você pode fazer o teste, segure a tecla alt, digite 193 e então solte alt, vai aparecer “┴”, que... adivinha... não é um “Á”, isso é óbvio. Com tudo isso, só me resta acreditar numa coisa, os desenvolvedores do PHP, simplesmente resolveram criar sua própria tabela ASCII e usá-la dentro do PHP. E o que mais me deixa de cara é no próprio manual falar que a função ord() retorna o valor ASCII, passa o link do site asciitable.com que diz que 193 é “┴” e não “Á” e o PHP simplesmente diz o contrário. Pra desencardo de consciência, vá novamente ao PHP e digite chr(193). O que imprime? “Á”.
Aí você me pergunta: mas então os operadores bit-a-bit do PHP não funcionam corretamente? Funciona, a tabela ASCII é que parece que não, se você usar chr(“á”), vai imprimir 225, daí faria sentido, pois 225-193=32. O que não faz sentido é que isso não é ASCII.
Eu até acho que a tal tabela ASCII do PHP faz mais sentido, senão a minha função não funcionaria. Mas então no site poderia dizer que é tabela “outro nome aqui”, como tabela chuchuca, tabela chinchila, sei lá, mas não tabela ASCII.
Se eu errei alguma coisa na minha lógica e por isso deu esse rolo todo aí e alguém me alertar sobre, eu até crio uma “Parte 3” aqui pra tentar explicar esse rolo com a tabela ASCII. Mas se for algo como “Os caras do PHP acharam que ficaria mais fácil” então não tem explicação não, eu até agradeço aos desenvolvedores do PHP, pois fica mais fácil lidar com caracteres. Mas se você quiser usar esses mesmos valores (números) em outros lugares, simplesmente não vai funcionar.
Chegamos ao final da “Parte 2” de artigos sobre Operadores bit-a-bit. Acredito realmente que já abordei tudo o que operadores bit-a-bit podem fazer. Sendo assim, acredito que não precise de uma terceira parte, basta vocês usarem vossa criatividade. Qualquer coisa me mandem um e-mail, se precisar realmente explicar alguma outra coisa, pode deixar que eu crio sim uma parte 3.
Isso aí galera, até a próxima.
Se você reparar na tabela ASCII postada na primeira página, vai reparar que as letras equivalentes entre maiúsculas e minúsculas só têm a relação (diferença de 32) entre os caracteres normais (sem acentos). Parece que os outros caracteres foram simplesmente jogados ali de forma aleatória.
Pra vocês conseguirem visualizar melhor, pegue qualquer letra com acento, “á” (ASCII 160) por exemplo e siga a lógica utilizada lá na primeira página. Converta para binário esse 160 (10100000) e então compare com o espaço utilizando o esquema do operador “^” (que eu usei pra passar de minúscula para maiúscula):
160: 10100000 032: 00100000 128: 10000000
Como você pode reparar ali, chegamos ao valor 128, que não tem nada a ver com o valor ASCII de “Á” (a letra maiúscula relativa de “á”), mas sim, é um “Ç”. Agora faça um teste usando o PHP, pegue esse caractere “á” e compare com o espaço usando o operador “^”.
<?php $letra = 'á' ^ ' '; print $letra; ?>
O que aconteceu? Apareceu “Á” e não “Ç”. Não está entendendo mais nada? Pois agora você vai entender menos ainda. Vamos novamente ao PHP, atribua o valor, usando o operador, à uma variável assim como eu fiz ali em cima, e use a função do PHP que imprime o valor ASCII: ord():
<?php $letra = 'á' ^ ' '; print ord($letra); ?>
Imprimiu 193, você pode fazer o teste, segure a tecla alt, digite 193 e então solte alt, vai aparecer “┴”, que... adivinha... não é um “Á”, isso é óbvio. Com tudo isso, só me resta acreditar numa coisa, os desenvolvedores do PHP, simplesmente resolveram criar sua própria tabela ASCII e usá-la dentro do PHP. E o que mais me deixa de cara é no próprio manual falar que a função ord() retorna o valor ASCII, passa o link do site asciitable.com que diz que 193 é “┴” e não “Á” e o PHP simplesmente diz o contrário. Pra desencardo de consciência, vá novamente ao PHP e digite chr(193). O que imprime? “Á”.
Aí você me pergunta: mas então os operadores bit-a-bit do PHP não funcionam corretamente? Funciona, a tabela ASCII é que parece que não, se você usar chr(“á”), vai imprimir 225, daí faria sentido, pois 225-193=32. O que não faz sentido é que isso não é ASCII.
Eu até acho que a tal tabela ASCII do PHP faz mais sentido, senão a minha função não funcionaria. Mas então no site poderia dizer que é tabela “outro nome aqui”, como tabela chuchuca, tabela chinchila, sei lá, mas não tabela ASCII.
Se eu errei alguma coisa na minha lógica e por isso deu esse rolo todo aí e alguém me alertar sobre, eu até crio uma “Parte 3” aqui pra tentar explicar esse rolo com a tabela ASCII. Mas se for algo como “Os caras do PHP acharam que ficaria mais fácil” então não tem explicação não, eu até agradeço aos desenvolvedores do PHP, pois fica mais fácil lidar com caracteres. Mas se você quiser usar esses mesmos valores (números) em outros lugares, simplesmente não vai funcionar.
Chegamos ao final da “Parte 2” de artigos sobre Operadores bit-a-bit. Acredito realmente que já abordei tudo o que operadores bit-a-bit podem fazer. Sendo assim, acredito que não precise de uma terceira parte, basta vocês usarem vossa criatividade. Qualquer coisa me mandem um e-mail, se precisar realmente explicar alguma outra coisa, pode deixar que eu crio sim uma parte 3.
Isso aí galera, até a próxima.
Alisson, este artigo está ótimo...
Porém é algo raramente utilizado em php, acredito que poucos hoje já tiveram problemas que isto ajudaria a resolver!
Abraço,
Felipe
Porém é algo raramente utilizado em php, acredito que poucos hoje já tiveram problemas que isto ajudaria a resolver!
Abraço,
Felipe
04/04/2007 8:39pm
(~17 anos atrás)
O artigo ficou tão ruim assim pra não receber nenhum comentário e ter nota 6.33?
02/04/2007 7:47am
(~17 anos atrás)
O PHP usa a tabela de caracteres ANSI e não ASCII somente.
A tabela ANSI (American National Standards Institute) é constituída da tabela ASCII (0 a 127) e mais `Latin 1 Windows´ (128 a 255)
Vejam http://ascii-table.com/ansi-codes.php
Por isso o PHP consegue fazer o uppper e o lower com caracteres acentuados utilizando os operadores ^ e | .
Espero ter ajudado.
XXande ;)