2011-04-16 5 views

Répondre

125

En utilisant la méthode getBytes, en lui attribuant le Charset (ou le nom Charset) approprié.

Exemple:

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

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

+9

Je suis légèrement gêné par la facilité avec laquelle c'était. –

+3

Ceci convertira les caractères non configurables comme '\ u00e0' (& agrave;) en '?'. Il serait plus agréable d'avoir une méthode qui convertit cela en 'a'. –

+11

Pour les personnes utilisant Java 7 ou version ultérieure, utilisez la classe [StandardCharsets] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html) qui contient des constantes standard charsets. 'byte [] b = s.getBytes (StandardCharsets.US_ASCII);' –

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

Il n'y a qu'un seul caractère erroné dans le code que vous avez essayé:

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

Notez la majuscule "Chaîne". Cela essaie d'appeler une méthode statique sur la classe de chaîne, qui n'existe pas. Au lieu de cela, vous devez appeler la méthode sur votre instance de chaîne:

byte[] bytes = string.getBytes(characterSet); 
+0

si oui, pouvez-vous s'il vous plaît me dire comment pourrait-il être qu'une lettre hébraïque est prise 1 octet (encodage ascii), il n'existe même pas dans les ascii. et il n'utilise pas encodung par défaut puisque je l'ai spécifié manuellement. http://i.stack.imgur.com/5WPD3.jpg –

+0

@RoyiNamir: Cela pourrait être mieux posté comme une nouvelle question, mais la raison en est que le caractère n'est pas encodable en US-ASCII et 'getBytes (Charset)' La méthode est spécifiée pour remplacer les caractères qui ne peuvent pas être codés. Avec US-ASCII, ce char de remplacement est le point d'interrogation, donc votre tableau d'octets contient un élément avec la valeur ASCII de '?' (63). –

0

Convertir une chaîne en valeurs 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

Le problème avec les autres solutions proposées est qu'ils soit déposer des caractères qui ne peuvent pas être directement mis en correspondance avec ASCII, ou les remplacer par un caractère de marqueur comme ?.

Vous voudrez peut-être avoir par exemple des caractères accentués convertis au même caractère sans l'accent. Il y a quelques astuces pour le faire (y compris la construction d'une table de mappage statique vous-même ou l'utilisation de la 'normalisation' existante définie pour unicode), mais ces méthodes sont loin d'être complètes. Votre meilleur pari est d'utiliser la bibliothèque junidecode, qui ne peut pas être complète non plus mais incorpore beaucoup d'expérience de la manière la plus saine de translittérer Unicode en ASCII.

4

Si vous arrive d'avoir besoin cela dans Android et que vous voulez le faire fonctionner avec quelque chose de plus que FroYo, vous pouvez également utiliser EncodingUtils.getAsciiBytes():

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

C'est en fait un très bon pourboire! Sur Android getBytes (...) ne fonctionne pas correctement même sur ICS + – strange

+0

Je ne trouve pas EncodingUtils n'importe où? – behelit

+1

@behelit si vous suivez mon lien, il redirige vers ce bit: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client Fondamentalement disant que vous devez inclure manuellement la bibliothèque HTTP Apache car elle est désormais obsolète. – dain

21

Si vous êtes un utilisateur il y a une classe Charsets à portée de main:

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

en plus de ne pas coder en dur le nom charset arbitraire dans votre code source, il a un avantage beaucoup plus grand: Charsets.US_ASCII est de type Charset (non String) de sorte que vous éviterez UnsupportedEncodingException vérifié uniquement à partir de String.getBytes(String), mais pas de String.getBytes(Charset). En Java 7, la classe StandardCharsets est équivalente.

+0

Malheureusement, 'String.getBytes (Charset)' n'a pas été ajouté avant API 9 :(Donc, si vous voulez cibler Froyo et plus, vous ne pouvez pas faire cela. – yincrash

-2

Essayez ceci:

/** 
* @(#)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

Dans ma chaîne Je caractères thaïs (tis620 encodée) et trémas allemands. La réponse des agiles m'a mis sur le bon chemin. Au lieu de .getBytes() J'utilise maintenant

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; 
    } 
Questions connexes