segunda-feira, 24 de novembro de 2014

Unicode: conceitos básicos

Fonte: http://www.devmedia.com.br/unicode-conceitos-basicos/25169

Unicode: conceitos básicos

1. Introdução

Unicode é um padrão adotado mundialmente que possibilita com que todos os caracteres de todas as linguagens escritas utilizadas no planeta possam ser representados em computadores. A “missão” do Unicode é apresentada de forma clara no web site do Unicode Consortium (entidade responsável pela sua gestão):
Unicode fornece um número único para cada caractere, não importa a plataforma,
não importa o programa,
não importa a linguagem.
O padrão Unicode é capaz de representar não somente as letras utilizadas pelas linguagens mais “familiares” para nós ocidentais, como Inglês, Espanhol, Francês e o nosso Português, mas também letras e símbolos utilizados em qualquer outra linguagem: Russo, Japonês, Chinês, Hebreu, etc. Além disso, inclui símbolos de pontuação, símbolos técnicos e outros caracteres que podem ser utilizados em texto escrito.

2. Como o Unicode Trabalha?

No padrão Unicode, cada diferente letra ou símbolo de cada alfabeto utilizado no mundo é mapeado para um diferente code point. O code point é um código no formato U + número em hexadecimal. O exemplo abaixo mostra os códigos das letras que compõem a palavra “BRASIL” (em maiúsculo).
B - U+0042
R - U+0052
A - U+0041
S - U+0053
I - U+0049
L - U+004C
É muito importante mencionar que as letras maiúsculas possuem code points diferentes das letras minúsculas. Por exemplo: o code point da letra “A” é U+0041, enquanto o da letra “a” é U+0061, o code point de “Ç” é U+00C7 e o de “ç” é U+00E7 (e por aí vai). Outra observação importante é que os primeiros 127 code points (até U+007F) são compatíveis com os códigos utilizados na antiga tabela ASCII (basicamente são os códigos associados aos números, letras maiúsculas e minúsculas sem acento e símbolos de pontuação mais comuns).
O aplicativo Mapa de caracteres (charmap) do Windows pode ser utilizado para consulta à tabela Unicode. Para acessá-lo, basta ir para o Prompt de Comando e digitar charmap. Na Figura 1, o Mapa de caracteres informa o code point associado à letra grega alfa.
Mapa de Caracteres
Figura 1: Mapa de Caracteres

3. Encodings

Do que foi apresentado na seção anterior, podemos entender que o Unicode nada mais é do que uma enorme tabela que associa um número único (code point) para cada diferente letra ou símbolo dos alfabetos de todo o mundo. Mas como esses code points podem ser armazenados em um arquivo texto ou na memória do computador? É aí que entram em cena os encodings.
Um encoding é uma técnica que define regras para armazenar os code points dos caracteres que compõem as strings na memória do computador. Existem vários deles: UTF-8, ISO-8859-1 (apelidado de Latin-1), UCS-2, Windows-1252, etc. Cada encoding utiliza uma técnica distinta para lidar com os códigos Unicode.
O encoding UTF-8, por exemplo, é capaz de representar qualquer caractere Unicode. Para conseguir isso, utiliza uma técnica que onde uma quantidade de 1 a 6 bytes pode ser utilizada para representar cada caractere. Ou seja, o UTF-8 não trabalha com uma representação em tamanho fixo. Os code points de 0 a 127 são armazenados com 1 byte. Porém, os demais podem ser armazenados em memória com tamanho de 2 a 6 bytes.
O UTF-8 é completo (armazena qualquer caractere Unicode) e usa uma técnica de armazenamento que pode ser considerada “sofisticada”. Outros encodings, como ISSO-8859-1 e Windows-1252 são menos completos do que o UTF-8, e preferem trabalhar apenas com um subconjunto da tabela Unicode (ex: apenas com caracteres das linguagens ocidentais). Em compensação, podem fazer uso de técnicas de armazenamento mais simples que, além disso, conseguem representar strings gastando um número menor de bytes.
Agora você já sabe o que significa Unicode e sabe diferenciar Unicode de encoding! Este é, sem dúvida, um passo importante para começar a “perder o medo” de encarar esse tema (que reconheço é bem chato de se estudar!). Para aprender mais sobre o assunto, recomendo a leitura do simpático tutorial disponibilizado emhttp://www.joelonsoftware.com/articles/Unicode.html. Boa sorte e até a próxima!


Leia mais em: Unicode: conceitos básicos http://www.devmedia.com.br/unicode-conceitos-basicos/25169#ixzz3Jzh97hQQ

Trabalhando com Arquivos UTF-8 em Java

Fonte: http://www.devmedia.com.br/trabalhando-com-arquivos-utf-8-em-java/27551

Trabalhando com Arquivos UTF-8 em Java

Veja neste artigo um método seguro para realizar a leitura e gravação de arquivos texto com encoding UTF-8 em java.

Trabalhando com Arquivos UTF-8 em Java Resumo: Este artigo descreve um método seguro para realizar a leitura e gravação de arquivos texto com encoding UTF-8 em java.

1. Introdução

Definimos encoding como uma técnica que define as regras para armazenar os códigos dos caracteres em memória (esses códigos são denominados code points no jargão Unicode). Na prática, existem vários encodings diferentes: UTF-8, ISO-8859-1 (apelidado de Latin-1), UCS-2, Windows-1252, etc. Cada um deles utiliza um algoritmo distinto para fazer a representação dos códigos Unicode.
UTF-8 diferencia-se da maioria dos outros encodings pelo fato de ser completo. Isto é: ele é capaz de armazenar qualquer caractere Unicode. Outros encodings, como ISO-8859-1 e Windows-1252, preferem trabalhar apenas com um subconjunto da tabela Unicode (ex: apenas com caracteres das linguagens ocidentais). A grande maioria dos softwares comerciais e open source (SGBD’s, por exemplo) prefere trabalhar internamente com o formato UTF-8, pois este encoding favorece a questão da internacionalização do produto. Pelo mesmo motivo, as linguagens padrão para troca de informações XML e JSON normalmente trabalham com a codificação UTF-8. Aliás, já existem vários arquivos e bases de dados de domínio público codificadas em UTF-8 na Internet.
Sendo assim, mais cedo ou mais tarde chegará a hora em que precisaremos trabalhar com arquivos UTF-8 (não há como fugir!!!). Neste artigo apresentaremos uma receita segura para trabalhar com UTF-8 na linguagem Java, tanto na leitura como na gravação de arquivos.

2. Java x UTF-8: O Problema

Na linguagem Java, as classes mais utilizadas para leitura e gravação de arquivos são java.io.FileReader e java.io.FileWriter, respectivamente. Essa situação é bastante justificável, uma vez que trabalhar com essas classes é muito simples na prática. No entanto, existe um problema importante associado a estas classes que precisa ser conhecido por todo desenvolvedor Java. O que ocorre é que, por default, ambas não usam UTF-8. Mas que problema isso pode causar? Muitos! Basicamente, se você tiver que trabalhar com um arquivo texto UTF-8 que possuir qualquer caractere que não seja padrão ASCII (ex: letras acentuadas, cedilha, etc.), o caractere em questão não será lido em nem gravado corretamente.
Demonstraremos isso com um exemplo. Considere o arquivo texto “poema.txt”, apresentado na figura 1. Este arquivo foi criado utilizando a codificação UTF-8 (veja o círculo em vermelho na figura).
Arquivo texto com encoding UTF-8
Figura 1: Arquivo texto com encoding UTF-8
O exemplo da listagem 1 mostra um pequeno programa onde a classe “FileReader” é usada para realizar a leitura do arquivo texto.
Listagem 1: Programa que não funciona com arquivos UTF-8
/**
 * Esta classe lê o arquivo "poema.txt" usando a classe java.io.FileReader. 
 * O programa não trabalha com UTF-8 de forma correta
 *
 */

import java.io.BufferedReader;
import java.io.FileReader;

public class LeituraFileReader {

 public static void main(String[] args) throws Exception {

  // abertura do arquivo
  FileReader arq = new FileReader("c:\\temp\\poema.txt");
  BufferedReader myBuffer = new BufferedReader(arq);

  // loop que lê e imprime todas as linhas do arquivo
  String linha = myBuffer.readLine();

  while (linha != null) {
   System.out.println(linha);
   linha = myBuffer.readLine();
  }

  arq.close();

 }

}
 
Infelizmente, ao executar o programa, o resultado é o mostrado na figura 2. Veja que todos os caracteres acentuados foram trocados por símbolos “malucos”.
Leitura com problema – UTF-8 não é processado corretamente
Figura 2: Leitura com problema – UTF-8 não é processado corretamente
Mas por que o problema ocorreu? A resposta pode ser encontrada na própria Java API:
“public class FileReader
Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.”
Em resumo: a classe assume que o arquivo texto a ser lido possui o encoding default do computador em que o programa está sendo executado. Para saber qual é a codificação, use o comando abaixo (no caso deste exemplo, o resultado exibido foi “cp1252”):
System.out.println(System.getProperty("file.encoding"));

3. Java x UTF-8: A Solução

Felizmente, é possível contornar o problema de maneira simples. A solução está descrita no texto da JAVA API: “para especificar o encoding construa um InputStreamReader em um FileInputStream”. O quê??? Bem, não se preocupe, pois a tradução dessa frase para o “computês”, ou seja, para uma linha de código Java é mostrada na listagem 2 (obs.: substitua “path” pelo caminho do seu arquivo).
Listagem 2: Abrir arquivo UTF-8 para leitura
BufferedReader arqIn = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
Agora vamos mostrar como seguir essa receita para fazer a leitura de um arquivo UTF-8. Na listagem 3, apresentamos o programa corrigido para ler o arquivo “poema.txt”.
Listagem 3: Programa que lê arquivo UTF-8
/**
 * Esta classe lê o arquivo "poema.txt" considerando o encoding UTF-8
 *
 */
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class LeituraUTF8 {

 public static void main(String[] args) throws Exception {

  // abertura do arquivo
  BufferedReader myBuffer = new BufferedReader(new InputStreamReader(new FileInputStream("c:\\temp\\poema.txt"), "UTF-8"));
  
  // loop que lê e imprime todas as linhas do arquivo
  String linha = myBuffer.readLine();

  while (linha != null) {
   System.out.println(linha);
   linha = myBuffer.readLine();
  }

  myBuffer.close();

 }
 
}
Dessa vez, os caracteres acentuados serão lidos normalmente, como mostra a figura 3.
Arquivo UTF-8 é processado corretamente
Figura 3: Arquivo UTF-8 é processado corretamente

4. Escrita de Arquivos

Para encerrar nosso artigo, abordaremos a questão da escrita de arquivos UTF-8. Uma possível solução é apresentada na listagem 4. Mais uma vez, seguiremos o conselho dado pela Java API:
“public class FileReader
Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.”
Então está bem, para criar um arquivo com encoding UTF-8 vamos construir um “OutputStreamWriter” em um “FileOutputStream”. O exemplo é apresentado na listagem 4, onde o programa produz um arquivo com a codificação UTF-8 chamado “acentos.txt” e contendo 3 linhas.
Listagem 4: Programa que grava arquivo UTF-8
/** Esta classe salva um arquivo com encoding UTF-8 *
 */

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class GravacaoUTF8 {

 public static void main(String[] args) throws Exception {
  
  OutputStreamWriter bufferOut = new OutputStreamWriter(new FileOutputStream("c:\\temp\\acentos.txt"),"UTF-8");
    
  bufferOut.write("acento agudo: áéíóú\n");
  bufferOut.write("acento circunflexo: âêîôû\n");
  bufferOut.write("fim");
  
  bufferOut.close();
 }
 
}
Este artigo apresentou a receita básica para trabalhar com UTF-8 em Java. Se desejar conhecer um pouquinho mais sobre Unicode e UTF-8, consulte o seguinte


Leia mais em: Trabalhando com Arquivos UTF-8 em Java http://www.devmedia.com.br/trabalhando-com-arquivos-utf-8-em-java/27551#ixzz3Jze9e92N

quarta-feira, 5 de novembro de 2014

Ampliar sinal Wifi através de vários repetidores (WDS)


http://support.apple.com/pt-br/HT4145

http://support.apple.com/pt-br/HT4262

Em uma rede expandida sem fio (802.11n) convencional não é possível conectar um repetidor a outro. Todos os repetidores devem se conectar diretamente na estação base principal.

Com o WDS isso é possível, porém, a velocidade da transmissão cai mais da metade.

WDS (802.11g)

Um Sistema de Distribuição Sem Fio (WDS) é o método usado para expandir o alcance de estações base Wi-Fi do AirPort Extreme 802.11a/b/g e do AirPort Express 802.11a/b/g. O WDS é compatível com o Utilitário AirPort 5.5.2 ou anterior.

O WDS permite que você configure cada estação base Wi-Fi em um dos três modos:
➊ WDS principal (estação base Wi-Fi primária)
➋ Retransmissão WDS
➌ Controle remoto WDS
Uma estação base principal do WDS ➊ está conectada à internet e compartilha sua conexão com as estações base de retransmissão WDS e remotas do WDS.
Uma estação base de retransmissão WDS ➋ compartilha a conexão de internet da estação base principal e também transmitirá a conexão para as estações base remotas do WDS.
Uma estação base remota do WDS ➌ simplesmente compartilha a conexão de internet da estação base principal do WDS, tanto diretamente se estiver ao alcance direto quando através de uma retransmissão WDS.
Todas as três configurações de estação base (WDS principal, controle remoto WDS e retransmissão WDS) podem compartilhar a conexão de internet da estação base Wi-Fi principal do WDS com os computadores cliente sem fio ou através de uma conexão Ethernet, se os computadores cliente estiverem conectados à estação base através de Ethernet.
Quando você configura as estações base em um WDS, é preciso saber o ID do AirPort de cada estação base. O ID do AirPort, também conhecido como o endereço MAC (Media Access Controller), é impresso em uma etiqueta na parte inferior da Estação base do AirPort Extreme ao lado do símbolo do AirPort e do lado do adaptador de alimentação da Estação base do AirPort Express.
Nota: Como uma retransmissão, a estação base Wi-Fi deve receber os dados de uma estação base Wi-Fi, agrupá-lo, enviá-lo para a outra estação base Wi-Fi e vice-versa. Esse método eficaz reduz a taxa de transferência mais da metade. Uma estação base Wi-Fi 802.11a/b/g deve ser somente usada dessa maneira em áreas onde não exista outra opção e onde uma maior taxa de transferência não é essencial.