Esto convertirá los caracteres no asignables como '\ u00e0' (& agrave;) en '?'. Sería mejor tener un método que convierta eso en 'a'.
Arnout Engelen
11
Para las personas que usan Java 7 o posterior, use la clase StandardCharsets que contiene algunas constantes para juegos de caracteres estándar. byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Observe la "Cadena" en mayúscula. Esto intenta invocar un método estático en la clase de cadena, que no existe. En su lugar, debe invocar el método en su instancia de cadena:
Si es así, ¿podría decirme cómo podría ser que una letra hebrea se toma 1 byte (codificación ascii), ni siquiera existe en el ascii? y no está usando encodung predeterminado ya que lo especifiqué manualmente. i.stack.imgur.com/5WPD3.jpg
Royi Namir
@RoyiNamir: Esto podría publicarse mejor como una nueva pregunta, pero la razón es que el carácter no se puede codificar en US-ASCII y el getBytes(Charset)método se especifica para reemplazar los caracteres que no se pueden codificar. Con US-ASCII, este carácter de reemplazo es el signo de interrogación, por lo que su matriz de bytes contiene un elemento con el valor ASCII de '?' (63).
Jörn Horstmann
5
El problema con otras soluciones propuestas es que eliminarán caracteres que no se pueden asignar directamente a ASCII o los reemplazarán con un carácter marcador como ?.
Es posible que desee, por ejemplo, que los caracteres acentuados se conviertan en ese mismo carácter sin el acento. Hay un par de trucos para hacer esto (incluida la construcción de una tabla de mapeo estático usted mismo o el aprovechamiento de la 'normalización' existente definida para Unicode), pero esos métodos están lejos de ser completos.
Su mejor opción es usar la biblioteca junidecode , que tampoco puede ser completa pero que incorpora mucha experiencia en la forma más sensata de transliterar Unicode a ASCII.
¡Este es realmente un buen consejo! En Android getBytes (...) NO funciona correctamente incluso en ICS +
extraño
¿No puedo encontrar EncodingUtils en ninguna parte?
behelit
1
@behelit, si sigue mi enlace, redirige a este bit: developer.android.com/about/versions/marshmallow/… Básicamente, dice que debe incluir manualmente la biblioteca HTTP de Apache, ya que ahora está en desuso.
En mi cadena tengo caracteres tailandeses (codificados en TIS620) y diéresis alemanas. La respuesta de Agiles me puso en el camino correcto. En lugar de .getBytes () que uso ahora
int len = mString.length(); // Length of the stringbyte[] dataset = newbyte[len];
for (int i = 0; i < len; ++i) {
char c = mString.charAt(i);
dataset[i]= (byte) c;
}
Encontré la solución. En realidad, la clase Base64 no está disponible en Android. El enlace se proporciona a continuación para obtener más información.
byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Si eres un guayabausuario hay una
Charsets
clase útil :String s = "Hello, world!"; byte[] b = s.getBytes(Charsets.US_ASCII);
Aparte de no codificar de forma rígida el nombre del juego de caracteres arbitrario en su código fuente, tiene una ventaja mucho mayor:
Charsets.US_ASCII
es deCharset
tipo (noString
), por lo que evita que se verifiquenUnsupportedEncodingException
arrojados solo desdeString.getBytes(String)
, pero no desdeString.getBytes(Charset)
.En Java 7 existe una
StandardCharsets
clase equivalente .fuente
String.getBytes(Charset)
no se agregó hasta la API 9 :( Entonces, si desea apuntar a Froyo y superior, no puede hacerlo.Solo hay un carácter incorrecto en el código que probó:
Charset characterSet = Charset.forName("US-ASCII"); String string = "Wazzup"; byte[] bytes = String.getBytes(characterSet); ^
Observe la "Cadena" en mayúscula. Esto intenta invocar un método estático en la clase de cadena, que no existe. En su lugar, debe invocar el método en su instancia de cadena:
byte[] bytes = string.getBytes(characterSet);
fuente
getBytes(Charset)
método se especifica para reemplazar los caracteres que no se pueden codificar. Con US-ASCII, este carácter de reemplazo es el signo de interrogación, por lo que su matriz de bytes contiene un elemento con el valor ASCII de '?' (63).El problema con otras soluciones propuestas es que eliminarán caracteres que no se pueden asignar directamente a ASCII o los reemplazarán con un carácter marcador como
?
.Es posible que desee, por ejemplo, que los caracteres acentuados se conviertan en ese mismo carácter sin el acento. Hay un par de trucos para hacer esto (incluida la construcción de una tabla de mapeo estático usted mismo o el aprovechamiento de la 'normalización' existente definida para Unicode), pero esos métodos están lejos de ser completos.
Su mejor opción es usar la biblioteca junidecode , que tampoco puede ser completa pero que incorpora mucha experiencia en la forma más sensata de transliterar Unicode a ASCII.
fuente
String s = "ASCII Text"; byte[] bytes = s.getBytes("US-ASCII");
fuente
Si necesita esto en Android y quiere que funcione con algo más antiguo que FroYo, también puede usar EncodingUtils.getAsciiBytes () :
byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");
fuente
En mi cadena tengo caracteres tailandeses (codificados en TIS620) y diéresis alemanas. La respuesta de Agiles me puso en el camino correcto. En lugar de .getBytes () que uso ahora
int len = mString.length(); // Length of the string byte[] dataset = new byte[len]; for (int i = 0; i < len; ++i) { char c = mString.charAt(i); dataset[i]= (byte) c; }
fuente
Convierte cadenas a valores ascii.
String test = "ABCD"; for ( int i = 0; i < test.length(); ++i ) { char c = test.charAt( i ); int j = (int) c; System.out.println(j); }
fuente
Encontré la solución. En realidad, la clase Base64 no está disponible en Android. El enlace se proporciona a continuación para obtener más información.
byte[] byteArray; byteArray= json.getBytes(StandardCharsets.US_ASCII); String encoded=Base64.encodeBytes(byteArray); userLogin(encoded);
Aquí está el enlace para la clase Base64: http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html
fuente
Prueba esto:
/** * @(#)demo1.java * * * @author * @version 1.00 2012/8/30 */ import java.util.*; public class demo1 { Scanner s=new Scanner(System.in); String str; int key; void getdata() { System.out.println ("plase enter a string"); str=s.next(); System.out.println ("plase enter a key"); key=s.nextInt(); } void display() { char a; int j; for ( int i = 0; i < str.length(); ++i ) { char c = str.charAt( i ); j = (int) c + key; a= (char) j; System.out.print(a); } public static void main(String[] args) { demo1 obj=new demo1(); obj.getdata(); obj.display(); } } }
fuente