Як перетворити рядок 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;), у '?'. Було б приємніше мати метод, який перетворює це на 'a'.
Arnout Engelen 02

11
Для людей, які використовують Java 7 або новішої версії, використовуйте клас StandardCharsets, який містить деякі константи для стандартних наборів символів. byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Alexis C.

23

Якщо ви є користувач є зручний 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);
               ^

Зверніть увагу на верхній регістр "Рядок". Це намагається викликати статичний метод для класу рядків, який не існує. Натомість вам потрібно викликати метод у вашому екземплярі рядка:

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

Якщо вам це потрібно в Android і ви хочете змусити його працювати з чим-небудь старшим, ніж FroYo, ви також можете використовувати EncodingUtils.getAsciiBytes () :

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

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) та німецькі umlauts. Відповідь спритних поставив мене на правильний шлях. Замість .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;
  }

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


-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();
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.