2011-04-16 21 views

Respuesta

125

Usando el método getBytes, dándole el nombre Charset (o Charset) adecuado.

Ejemplo:

String s = "Hello, there."; 
byte[] b = s.getBytes(StandardCharsets.US_ASCII); 

(Antes de Java 7: byte[] b = s.getBytes("US-ASCII");)

+9

Estoy un poco avergonzado por lo fácil que fue eso. –

+3

Esto convertirá caracteres no asignables como '\ u00e0' (& agrave;) en '?'. Sería mejor tener un método que lo convierta en 'a'. –

+11

Para las personas que usan Java 7 o posterior, utilice la clase [StandardCharsets] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html) que contiene algunas constantes para el estándar Conjuntos 'byte [] b = s.getBytes (StandardCharsets.US_ASCII);' –

4
String s = "ASCII Text"; 
byte[] bytes = s.getBytes("US-ASCII"); 
5

Sólo hay un carácter incorrecto en el código que ha intentado:

Charset characterSet = Charset.forName("US-ASCII"); 
String string = "Wazzup"; 
byte[] bytes = String.getBytes(characterSet); 
      ^

Aviso mayúsculas "Cuerda". 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); 
+0

si es así, ¿podría decirme cómo podría ser que una letra hebrea se tome 1 byte (codificación ascii), incluso no existe en el ascii. y no está usando encodung predeterminado ya que especifiqué manualmente. http://i.stack.imgur.com/5WPD3.jpg –

+0

@RoyiNamir: Esto podría publicarse mejor como una nueva pregunta, pero la razón es que el carácter no es codificable en US-ASCII y el 'getBytes (Charset)' El método se especifica para reemplazar 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) –

0

Convertir cadena 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); 
    } 
5

El problema con otras soluciones propuestas es que van a caer bien caracteres que no se pueden asignar directamente a ASCII, o reemplazarlos con un personaje como marcador de ?.

Es posible que desee tener, por ejemplo, caracteres acentuados convertidos a ese mismo carácter sin el acento. Hay un par de trucos para hacer esto (incluida la construcción de una tabla de asignación estática usted mismo o el aprovechamiento de la 'normalización' existente definida para Unicode), pero esos métodos están lejos de estar completos.

Su mejor opción es utilizar la biblioteca junidecode, que no puede completarse, pero incorpora una gran cantidad de experiencia de la manera más sensata para la transcripción de Unicode a ASCII.

4

Si le sucede a necesitar esto en Android y quiere hacer que funcione con cualquier cosa mayor que Froyo, también se puede utilizar EncodingUtils.getAsciiBytes():

byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text"); 
+1

¡Este es un buen consejo! En Android getBytes (...) NO funciona correctamente incluso en ICS + – strange

+0

No encuentro EncodingUtils en ningún lado? – behelit

+1

@behelit si sigues mi enlace redirecciona a este bit: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client Básicamente diciendo que necesita incluir manualmente la biblioteca Apache HTTP ya que está en desuso ahora. – dain

21

Si usted es un usuario hay una clase práctica Charsets: no Charsets.US_ASCII es de tipo Charset (:

String s = "Hello, world!"; 
byte[] b = s.getBytes(Charsets.US_ASCII); 

Aparte de no codificación dura de nombre de conjunto de caracteres arbitraria en el código fuente que tiene una ventaja mucho más grande 10) para evitar marcar UnsupportedEncodingException lanzado solo desde String.getBytes(String), pero no desde String.getBytes(Charset).

En Java 7 existe la clase equivalente StandardCharsets.

+0

lamentablemente, 'String.getBytes (Charset)' no se ha agregado hasta la API 9 :(Entonces, si quiere apuntar a Froyo y arriba, no puede hacer eso. – yincrash

-2

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(); 
     } 
    } 
} 
2

En mi cadena de caracteres tailandeses tengo TIS620 (codificada) y diéresis alemanas. La respuesta de Agiles me puso en el camino correcto. En lugar de .getBytes() 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; 
    } 
0

Por la gracia de ALLAH 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

Cuestiones relacionadas