sirven que programacion practicas para estandares codigos codificacion buenas java encoding internationalization findbugs

que - codigos java pdf



Confianza en la codificación predeterminada, ¿qué debería usar y por qué? (3)

Debe usar la codificación predeterminada cada vez que lea un archivo que esté fuera de su aplicación y se puede suponer que está en la codificación local del usuario, por ejemplo, archivos de texto escritos por el usuario. Es posible que desee utilizar la codificación predeterminada al escribir dichos archivos, dependiendo de lo que el usuario vaya a hacer con ese archivo más adelante.

No debe usar la codificación predeterminada para ningún otro archivo, especialmente los archivos relevantes para la aplicación.

Si su aplicación, por ejemplo, escribe archivos de configuración en formato de texto, siempre debe especificar la codificación. En general, UTF-8 es siempre una buena opción, ya que es compatible con casi todo. De lo contrario, podrían producirse accidentes inesperados por parte de usuarios de otros países.

Esto no solo se limita a la codificación de caracteres, sino también a formatos de fecha / hora, numéricos u otros formatos específicos del idioma. Si, por ejemplo, utiliza la codificación predeterminada y las cadenas de fecha / hora predeterminadas en una máquina estadounidense, intente leer ese archivo en un servidor alemán, se sorprenderá de por qué una mitad es un galimatías y la otra mitad tiene un mes / día confuso o apagado por una hora debido al horario de verano.

FindBugs informa un error:

Confianza en la codificación predeterminada Encontré una llamada a un método que realizará una conversión de byte a cadena (o de cadena a byte) y asumirá que la codificación de plataforma predeterminada es adecuada. Esto hará que el comportamiento de la aplicación varíe entre plataformas. Utilice una API alternativa y especifique un nombre de conjunto de caracteres o un conjunto de caracteres explícitamente.

Utilicé FileReader de esta manera (solo un fragmento de código):

public ArrayList<String> getValuesFromFile(File file){ String line; StringTokenizer token; ArrayList<String> list = null; BufferedReader br = null; try { br = new BufferedReader(new FileReader(file)); list = new ArrayList<String>(); while ((line = br.readLine())!=null){ token = new StringTokenizer(line); token.nextToken(); list.add(token.nextToken()); ...

Para corregir el error, necesito cambiar

br = new BufferedReader(new FileReader(file));

a

br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.defaultCharset()));

Y cuando uso PrintWriter, se produce el mismo error. Entonces ahora tengo una pregunta. ¿Cuándo puedo (debería) usar FileReader y PrintWriter, si no es una buena práctica, confíe en la codificación predeterminada? Y la segunda pregunta es usar Charset.defaultCharset () correctamente? Decidí usar este método para definir automáticamente el juego de caracteres del sistema operativo del usuario.


Si el archivo está bajo el control de su aplicación, y si desea que el archivo esté codificado en la codificación predeterminada de la plataforma, puede usar la codificación de plataforma predeterminada. Especificarlo explícitamente lo hace más claro, para usted y futuros mantenedores, que esta es su intención. Esto sería un valor razonable por defecto para un editor de texto, por ejemplo, que luego escribiría archivos que cualquier otro editor en esta plataforma podría leer.

Si, por otro lado, desea asegurarse de que se pueda escribir cualquier carácter posible en su archivo, debe usar una codificación universal como UTF8.

Y si el archivo proviene de una aplicación externa, o se supone que es compatible con una aplicación externa, entonces debe usar la codificación que esta aplicación externa espera.

Lo que debes tener en cuenta es que si escribes un archivo como lo haces en una máquina y lo lees como lo haces en otra máquina, que no tiene la misma codificación predeterminada, no necesariamente serás capaz de lee lo que has escrito El uso de una codificación específica, para escribir y leer, como UTF8, garantiza que el archivo siempre será el mismo, independientemente de la plataforma que se use al escribir el archivo.


Idealmente, debería ser:

try (InputStream in = new FileInputStream(file); Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(reader)) {

...o:

try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {

... suponiendo que el archivo está codificado como UTF-8.

Prácticamente todas las codificaciones que no son formato de transformación Unicode son obsoletas para los datos de lenguaje natural. Hay idiomas que no puede admitir sin Unicode.