Jak przekonwertować ciąg Java na tablicę bajtów ASCII?

Odpowiedzi:

157

Korzystanie z getBytesmetody, nadanie jej odpowiedniej Charset(lub Charsetnazwy).

Przykład:

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

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

Sebastian Paaske Tørholm
źródło
10
Jestem lekko zawstydzony, jakie to było łatwe.
ferma strusia
4
Spowoduje to przekonwertowanie znaków, których nie można odwzorować, takich jak „\ u00e0” (& agrave;) na „?”. Lepiej byłoby mieć metodę, która przekształca to w „a”.
Arnout Engelen
11
Dla osób używających Java 7 lub nowszej, użyj klasy StandardCharsets, która zawiera pewne stałe dla standardowych zestawów znaków. byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Alexis C.
23

Jeśli jesteś użytkownik jest przydatna Charsetsklasa:

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

Oprócz tego, że nie zakodujesz na stałe dowolnej nazwy zestawu znaków w swoim kodzie źródłowym, ma on znacznie większą zaletę: Charsets.US_ASCIIjest Charsettypu (nie String), więc unikasz zaznaczania UnsupportedEncodingExceptionwyrzucanego tylko z String.getBytes(String), ale nie z String.getBytes(Charset).

W Javie 7 istnieje równoważna StandardCharsetsklasa.

Tomasz Nurkiewicz
źródło
niestety, String.getBytes(Charset)nie został dodany do API 9 :( Więc jeśli chcesz kierować reklamy na Froyo i
nowsze
5

W próbowanym kodzie jest tylko jeden znak nieprawidłowy:

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

Zwróć uwagę na wielkie litery „String”. To próbuje wywołać metodę statyczną w klasie string, która nie istnieje. Zamiast tego musisz wywołać metodę na swojej instancji ciągu:

byte[] bytes = string.getBytes(characterSet);
Jörn Horstmann
źródło
jeśli tak, czy możesz mi powiedzieć, jak to możliwe, że litera hebrajska jest pobierana 1 bajt (kodowanie ascii), a nawet nie istnieje w ascii. i nie używa domyślnego kodowania, ponieważ określiłem ręcznie. i.stack.imgur.com/5WPD3.jpg
Royi Namir
@RoyiNamir: To może być lepiej opublikowane jako nowe pytanie, ale powodem jest to, że znak nie jest kodowany w US-ASCII i określono getBytes(Charset)metodę zastępowania znaków, których nie można zakodować. W przypadku US-ASCII ten znak zastępczy jest znakiem zapytania, więc tablica bajtów zawiera jeden element o wartości ASCII „?” (63).
Jörn Horstmann
5

Problem z innymi proponowanymi rozwiązaniami polega na tym, że albo upuszczają znaki, których nie można bezpośrednio odwzorować na ASCII, albo zastępują je znakiem znacznika, takim jak ? .

Możesz na przykład chcieć przekonwertować znaki akcentowane na ten sam znak bez akcentu. Jest kilka sztuczek, aby to zrobić (w tym samodzielne zbudowanie statycznej tabeli mapowania lub wykorzystanie istniejącej „normalizacji” zdefiniowanej dla Unicode), ale metody te są dalekie od ukończenia.

Najlepszym rozwiązaniem jest użycie biblioteki junidecode , która też nie może być kompletna, ale zawiera duże doświadczenie w najbardziej rozsądnym sposobie transliteracji Unicode na ASCII.

Arnout Engelen
źródło
4
String s = "ASCII Text";
byte[] bytes = s.getBytes("US-ASCII");
Babar
źródło
4

Jeśli potrzebujesz tego w Androidzie i chcesz, aby działało z czymkolwiek starszym niż FroYo, możesz również użyć EncodingUtils.getAsciiBytes () :

byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");
dain
źródło
1
To całkiem dobra wskazówka! Na Androidzie getBytes (...) NIE działa poprawnie nawet na ICS +
dziwne
Nie mogę nigdzie znaleźć EncodingUtils?
behelit
1
@behelit, jeśli podążasz za moim linkiem, przekierowuje do tego bitu: developer.android.com/about/versions/marshmallow/ ... Zasadniczo mówiąc, musisz ręcznie dołączyć bibliotekę HTTP Apache, ponieważ jest teraz przestarzała.
Dain
Ale jeśli jesteś po prostu patrząc na docs, szukając „apache http encodingutils” daje kilka użytecznych wyników, takich jak: hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/...
Dain
3

W swoim ciągu mam znaki tajskie (zakodowane w TIS620) i niemieckie umlauty. Odpowiedź udzielona przez agiles skierowała mnie na właściwą ścieżkę. Zamiast .getBytes () używam teraz

  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
źródło
0

Konwertuj ciąg na wartości 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);
   }
zwinni
źródło
-2

Spróbuj tego:

/**
 * @(#)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
źródło