Как преобразовать строку Java в массив байтов ASCII?

Ответы:

157

Используя getBytesметод, присвоив ему соответствующее Charset(или Charsetназвание).

Пример:

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

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

Себастьян Паске Торхольм
источник
10
Меня слегка смущает, насколько это было легко.
Страусиная ферма
4
Это преобразует неотображаемые символы, такие как '\ u00e0' (& agrave;), в '?'. Было бы лучше иметь метод, который преобразует это в «а».
Arnout Engelen
11
Для людей, использующих Java 7 или новее, используйте класс StandardCharsets, который содержит некоторые константы для стандартных кодировок. byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Alexis C.
23

Если вы user есть удобный Charsetsкласс:

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

Помимо отсутствия жесткого кодирования произвольного имени кодировки в исходном коде, он имеет гораздо большее преимущество: Charsets.US_ASCIIимеет Charsetтип (не String), поэтому вы избегаете проверки, UnsupportedEncodingExceptionвыбрасываемой только из String.getBytes(String), но не из String.getBytes(Charset).

В Java 7 есть эквивалентный StandardCharsetsкласс.

Томаш Нуркевич
источник
к сожалению, String.getBytes(Charset)не был добавлен до API 9 :( Так что, если вы хотите настроить таргетинг на Froyo и выше, вы не можете этого сделать.
yincrash
5

В коде, который вы пробовали, неверен только один символ:

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

Обратите внимание на верхний регистр «String». Это пытается вызвать статический метод для строкового класса, которого не существует. Вместо этого вам нужно вызвать метод в экземпляре строки:

byte[] bytes = string.getBytes(characterSet);
Йорн Хорстманн
источник
Если да, то не могли бы вы сказать мне, как могло случиться так, что буква иврита занимает 1 байт (кодировка ascii), ее даже нет в ascii. и он не использует кодировку по умолчанию, поскольку я указал вручную. i.stack.imgur.com/5WPD3.jpg
Рой Намир
@RoyiNamir: Это может быть лучше опубликовано как новый вопрос, но причина в том, что символ не кодируется в US-ASCII, а getBytes(Charset)метод указан для замены символов, которые не могут быть закодированы. В US-ASCII этот заменяющий символ представляет собой вопросительный знак, поэтому ваш массив байтов содержит один элемент со значением ASCII '?' (63).
Йорн Хорстманн
5

Проблема с другими предлагаемыми решениями заключается в том, что они либо отбрасывают символы, которые нельзя напрямую сопоставить с ASCII, либо заменяют их символом маркера, например ?.

Например, вы можете захотеть преобразовать акцентированные символы в тот же самый символ без акцента. Для этого есть несколько уловок (в том числе создание таблицы статического сопоставления самостоятельно или использование существующей «нормализации», определенной для Unicode), но эти методы далеки от завершения.

Лучше всего использовать библиотеку junidecode , которая тоже не может быть полной, но включает в себя большой опыт в наиболее разумном способе транслитерации Unicode в ASCII.

Арноут Энгелен
источник
4
String s = "ASCII Text";
byte[] bytes = s.getBytes("US-ASCII");
Бабар
источник
4

Если вам это нужно в Android и вы хотите, чтобы он работал с чем-то старше FroYo, вы также можете использовать EncodingUtils.getAsciiBytes () :

byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");
dain
источник
1
На самом деле это очень хороший совет! На Android getBytes (...) НЕ работает должным образом даже на ICS +
странно,
Я нигде не могу найти EncodingUtils?
behelit
1
@behelit, если вы перейдете по моей ссылке, он перенаправит вас на этот бит: developer.android.com/about/versions/marshmallow/… В основном это означает, что вам нужно вручную включить HTTP-библиотеку Apache, поскольку она сейчас устарела.
dain
Но если вы просто ищете документы, в поисках «Apache HTTP encodingutils» дает некоторые полезные результаты , как: hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/...
Дейн
3

В моей строке есть тайские символы (в кодировке TIS620) и немецкие умляуты. Ответ от Agiles направил меня на правильный путь. Вместо .getBytes () сейчас использую

  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
источник
0

Преобразуйте строку в значения 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);
   }
проворный
источник
0

Я нашел решение. На самом деле класс Base64 недоступен в Android. Ссылка приведена ниже для получения дополнительной информации.

byte[] byteArray;                                                  
     byteArray= json.getBytes(StandardCharsets.US_ASCII);
    String encoded=Base64.encodeBytes(byteArray);
    userLogin(encoded);

Вот ссылка для класса Base64: http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html

Abdulmateen Ch.
источник
-2

Попробуй это:

/**
 * @(#)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();
        }
    }
}
нитин патель
источник