Wie konvertiere ich einen Java-String in ein ASCII-Byte-Array?

Antworten:

156

Verwenden Sie die getBytesMethode, und geben Sie ihr den entsprechenden Namen Charset(oder CharsetNamen).

Beispiel:

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

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

Sebastian Paaske Tørholm
quelle
10
Es ist mir leicht peinlich, wie einfach das war.
Bauernhof Strauß
4
Dadurch werden nicht zuordnungsfähige Zeichen wie '\ u00e0' (& agrave;) in '?' Konvertiert. Es wäre schöner, eine Methode zu haben, die das in 'a' umwandelt.
Arnout Engelen
11
Verwenden Sie für Benutzer von Java 7 oder höher die Klasse StandardCharsets, die einige Konstanten für Standardzeichensätze enthält. byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Alexis C.
23

Wenn du eine ... bist Benutzer gibt es eine handliche CharsetsKlasse:

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

Abgesehen davon, dass ein beliebiger Zeichensatzname in Ihrem Quellcode nicht fest codiert ist, hat er einen viel größeren Vorteil: Er Charsets.US_ASCIIist vom CharsetTyp (nicht String), sodass Sie vermeiden, dass UnsupportedEncodingExceptioner nur von String.getBytes(String), aber nicht von geworfen wird String.getBytes(Charset).

In Java 7 gibt es eine entsprechende StandardCharsetsKlasse.

Tomasz Nurkiewicz
quelle
Leider String.getBytes(Charset)wurde erst API 9 hinzugefügt :( Wenn Sie also auf Froyo und höher abzielen möchten, können Sie das nicht tun.
Yincrash
5

Der Code, den Sie ausprobiert haben, enthält nur ein falsches Zeichen:

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

Beachten Sie den Großbuchstaben "String". Dadurch wird versucht, eine statische Methode für die Zeichenfolgenklasse aufzurufen, die nicht vorhanden ist. Stattdessen müssen Sie die Methode für Ihre Zeichenfolgeninstanz aufrufen:

byte[] bytes = string.getBytes(characterSet);
Jörn Horstmann
quelle
Wenn ja, können Sie mir bitte sagen, wie es sein kann, dass ein hebräischer Buchstabe 1 Byte (ASCII-Codierung) enthält und nicht einmal im ASCII vorhanden ist. und es verwendet keine Standardcodierung, da ich manuell angegeben habe. i.stack.imgur.com/5WPD3.jpg
Royi Namir
@RoyiNamir: Dies könnte besser als neue Frage veröffentlicht werden, aber der Grund ist, dass Zeichen in US-ASCII nicht codierbar sind und die getBytes(Charset)Methode angegeben wird, um Zeichen zu ersetzen, die nicht codiert werden können. Bei US-ASCII ist dieses Ersatzzeichen das Fragezeichen, sodass Ihr Bytearray ein Element mit dem ASCII-Wert '?' Enthält. (63).
Jörn Horstmann
5

Das Problem bei anderen vorgeschlagenen Lösungen besteht darin, dass sie entweder Zeichen löschen, die nicht direkt ASCII zugeordnet werden können, oder sie durch ein Markierungszeichen wie ersetzen ?.

Möglicherweise möchten Sie beispielsweise Zeichen mit Akzent ohne Akzent in dasselbe Zeichen konvertieren lassen. Hierfür gibt es einige Tricks (einschließlich der Erstellung einer statischen Zuordnungstabelle selbst oder der Nutzung der für Unicode definierten vorhandenen "Normalisierung"), aber diese Methoden sind bei weitem nicht vollständig.

Am besten verwenden Sie die Junidecode- Bibliothek, die ebenfalls nicht vollständig sein kann, aber viel Erfahrung in der vernünftigsten Art der Übersetzung von Unicode in ASCII beinhaltet.

Arnout Engelen
quelle
4
String s = "ASCII Text";
byte[] bytes = s.getBytes("US-ASCII");
Babar
quelle
4

Wenn Sie dies in Android benötigen und es mit älteren Versionen als FroYo verwenden möchten, können Sie auch EncodingUtils.getAsciiBytes () verwenden :

byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");
dain
quelle
1
Das ist eigentlich ein ziemlich guter Tipp! Unter Android funktioniert getBytes (...) auch auf ICS + NICHT richtig
seltsam
Ich kann EncodingUtils nirgendwo finden?
siehe
1
@behelit Wenn Sie meinem Link folgen, wird zu diesem Bit weitergeleitet: developer.android.com/about/versions/marshmallow/… Grundsätzlich müssen Sie die Apache-HTTP-Bibliothek manuell einschließen, da sie jetzt veraltet ist.
Dain
Wenn Sie jedoch nur nach den Dokumenten suchen, liefert die Suche nach "Apache http encodingutils" einige nützliche Ergebnisse wie: hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/…
dain
3

In meiner Zeichenfolge habe ich thailändische Zeichen (TIS620-codiert) und deutsche Umlaute. Die Antwort von Agiles brachte mich auf den richtigen Weg. Anstelle von .getBytes () verwende ich jetzt

  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;
  }
thpitsch
quelle
0

Konvertieren Sie einen String in ASCII-Werte.

   String test = "ABCD";

   for ( int i = 0; i < test.length(); ++i ) {
   char c = test.charAt( i );
   int j = (int) c;
   System.out.println(j);
   }
agiles
quelle
-2

Versuche dies:

/**
 * @(#)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();
        }
    }
}
Nitin Patel
quelle