solo - validar jtextfield java
¿Por qué los nombres de caracteres no son constantes? (6)
Los problemas del conjunto de caracteres son confusos y complicados por sí mismos, pero además de eso, debes recordar los nombres exactos de tus conjuntos de caracteres. ¿Es "utf8"
? O "utf-8"
? O tal vez "UTF-8"
? Cuando busques en Internet ejemplos de código, verás todo lo anterior. ¿Por qué no solo hacerles constantes con nombre y usar Charset.UTF8
?
Dos años después, los conjuntos de caracteres estándar de Java 7 ahora definen las constantes para los 6 conjuntos de caracteres estándar.
Si estás atascado en Java 5/6, puedes usar las constantes Charsets de Guava, como lo sugieren Kevin Bourrillion y Jon Skeet.
El estado actual de la API de codificación deja algo que desear. Algunas partes de la API de Java 6 no aceptan Charset
en lugar de una cadena (en logging
, dom.ls
, PrintStream
; puede haber otras). No ayuda que se suponga que las codificaciones tienen diferentes nombres canónicos para diferentes partes de la biblioteca estándar.
Puedo entender cómo las cosas llegaron a donde están; No estoy seguro de tener ideas brillantes sobre cómo solucionarlos.
Como un aparte...
Puede buscar los nombres para la implementación de Java 6 de Sun here .
Para UTF-8, los valores canónicos son "UTF-8"
para java.nio
y "UTF8"
para java.lang
y java.io
Las únicas codificaciones que requiere la especificación de un JRE son: US-ASCII; ISO-8859-1; UTF-8; UTF-16BE; UTF-16LE; UTF-16 .
En java 1.7
import java.nio.charset.StandardCharsets
ej: StandardCharsets.UTF_8
StandardCharsets.US_ASCII
Hace mucho tiempo que he definido una clase de utilidad con las constantes de conjunto de caracteres UTF_8, ISO_8859_1 y US_ASCII.
Además, hace mucho tiempo (hace más de 2 años) hice una prueba de rendimiento simple entre el new String( byte[], Charset )
y el new String( byte[], String charset_name )
y descubrí que esta última implementación es CONSIDERABLEMENTE más rápida. Si observa el código fuente, bajo el capó, verá que, de hecho, siguen un camino muy diferente.
Por eso incluí una utilidad en la misma clase.
public static String stringFromByteArray (
final byte[] array,
final Charset charset
)
{
try
{
return new String( array, charset.name( ) )
}
catch ( UnsupportedEncodingException ex )
{
// cannot happen
}
}
Por qué el constructor String (byte [], Charset) no hace lo mismo, me gana.
La respuesta simple a la pregunta formulada es que las cadenas de caracteres disponibles varían de una plataforma a otra.
Sin embargo, hay seis que se requieren para estar presentes, por lo que se podrían haber hecho constantes para las de hace mucho tiempo. No sé por qué no lo eran.
JDK 1.4 hizo una gran cosa al introducir el tipo Charset. En este punto, ya no habrían querido proporcionar constantes de cadena, ya que el objetivo es que todos usen instancias de Charset. Entonces, ¿por qué no proporcionar las seis constantes estándar de Charset, entonces? Le pregunté a Martin Buchholz ya que él estaba sentado justo a mi lado, y dijo que no había una razón particularmente buena, excepto que en ese momento, las cosas estaban a medio hacer, ya que muy pocas API de JDK se habían adaptado a acepte Charset, y de las que estaban, las sobrecargas de Charset generalmente se comportaron un poco peor.
Es triste que solo en JDK 1.6 finalmente hayan terminado de equipar todo con sobrecargas de Charset. Y que esta situación de rendimiento hacia atrás todavía existe (la razón es increíblemente rara y no puedo explicarlo, ¡pero está relacionada con la seguridad!).
En pocas palabras, simplemente defina sus propias constantes, o use la clase Charsets de Guava a la que Tony the Pony se vinculó (aunque esa biblioteca aún no está realmente disponible).
Actualización: una clase de StandardCharsets
está en JDK 7.
Yo diría que podemos hacerlo mucho mejor que eso ... ¿por qué los conjuntos de caracteres con garantía de disponibilidad no son accesibles directamente? Charset.UTF8
debe ser una referencia al Charset
, no el nombre como una cadena. De esa manera no tendríamos que manejar la UnsupportedEncodingException
todo el lugar.
Tenga en cuenta que también creo que .NET eligió una mejor estrategia al utilizar de forma predeterminada UTF-8 en todas partes. Luego se arruinó al nombrar la propiedad de codificación "por defecto del sistema operativo" simplemente Encoding.Default
, que no es la predeterminada dentro de .NET :(
Volver a comentar sobre la compatibilidad con el FileWriter
de caracteres de Java: ¿por qué no hay un constructor para FileWriter
/ FileReader
que tome un Charset
? Básicamente, esas son clases casi inútiles debido a esa restricción. Casi siempre se necesita un InputStreamReader
alrededor de un FileInputStream
o el equivalente para la salida :(
Enfermera, enfermera, ¿dónde está mi medicina?
EDITAR: Se me ocurre que esto realmente no ha respondido a la pregunta. La respuesta real es, presumiblemente, "nadie involucrado pensó en ello" o "alguien involucrado pensó que era una mala idea". Yo sugeriría encarecidamente que las clases de utilidad internas que brindan los nombres o conjuntos de caracteres eviten la duplicación en torno al código base ... O simplemente puede usar el que usamos en Google cuando se escribió esta respuesta por primera vez . (Tenga en cuenta que a partir de Java 7, simplemente usaría StandardCharsets
lugar).