Làm thế nào để chuyển đổi một chuỗi Java thành một mảng byte ASCII?


Câu trả lời:


157

Sử dụng getBytesphương pháp, đặt tên Charset(hoặc Charsettên) thích hợp .

Thí dụ:

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

(Trước Java 7 byte[] b = s.getBytes("US-ASCII");:)


10
Tôi hơi xấu hổ vì điều đó quá dễ dàng.
trang trại đà điểu

4
Điều này sẽ chuyển đổi các ký tự không thể điều khiển như '\ u00e0' (& agrave;) thành '?'. Sẽ tốt hơn nếu có một phương pháp chuyển đổi thành 'a'.
Arnout Engelen

11
Đối với những người sử dụng Java 7 trở lên, hãy sử dụng lớp StandardCharsets chứa một số hằng số cho các bộ ký tự chuẩn. byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Alexis C.

23

Nếu bạn là một người dùng có một Charsetslớp tiện dụng :

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

Ngoài việc không phải mã hóa cứng tên bộ ký tự tùy ý trong mã nguồn của bạn, nó còn có một lợi thế lớn hơn nhiều: Charsets.US_ASCIIthuộc Charsetloại (không phải String), do đó bạn tránh được chọn UnsupportedEncodingExceptionchỉ ném từ String.getBytes(String)chứ không phải từ String.getBytes(Charset).

Trong Java 7 có StandardCharsetslớp tương đương .


thật đáng buồn, String.getBytes(Charset)không được thêm vào cho đến khi API 9 :( Vì vậy, nếu bạn muốn nhắm mục tiêu Froyo trở lên, bạn không thể làm điều đó.
yincrash

5

Chỉ có một ký tự sai trong mã bạn đã thử:

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

Lưu ý chữ hoa "String". Điều này cố gắng gọi một phương thức tĩnh trên lớp chuỗi, phương thức này không tồn tại. Thay vào đó, bạn cần gọi phương thức trên phiên bản chuỗi của mình:

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

nếu vậy, bạn có thể vui lòng cho tôi biết làm thế nào mà một chữ cái tiếng Do Thái được lấy 1 byte (mã hóa ascii), nó thậm chí không tồn tại trong ascii. và nó không sử dụng mã hóa mặc định vì tôi đã chỉ định thủ công. i.stack.imgur.com/5WPD3.jpg
Royi Namir

@RoyiNamir: Điều này có thể được đăng dưới dạng một câu hỏi mới, nhưng lý do là ký tự không thể mã hóa trong US-ASCII và getBytes(Charset)phương pháp được chỉ định để thay thế các ký tự không thể mã hóa. Với US-ASCII, ký tự thay thế này là dấu chấm hỏi, vì vậy mảng byte của bạn chứa một phần tử có giá trị ASCII là '?' (63).
Jörn Horstmann

5

Vấn đề với các giải pháp được đề xuất khác là chúng sẽ loại bỏ các ký tự không thể ánh xạ trực tiếp tới ASCII hoặc thay thế chúng bằng một ký tự đánh dấu như ?.

Bạn có thể muốn chuyển đổi các ký tự có dấu ví dụ thành cùng một ký tự không dấu. Có một vài thủ thuật để thực hiện việc này (bao gồm tự xây dựng bảng ánh xạ tĩnh hoặc tận dụng 'chuẩn hóa' hiện có được xác định cho unicode), nhưng những phương pháp đó vẫn chưa hoàn thiện.

Đặt cược tốt nhất của bạn là sử dụng thư viện junidecode , thư viện này cũng không thể hoàn chỉnh nhưng kết hợp nhiều kinh nghiệm theo cách chuyển ngữ Unicode sang ASCII một cách lành mạnh nhất.


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

4

Nếu bạn cần điều này trong Android và muốn làm cho nó hoạt động với bất kỳ thứ gì cũ hơn FroYo, bạn cũng có thể sử dụng EncodingUtils.getAsciiBytes () :

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

1
Đây thực sự là một mẹo khá hay! Trên Android getBytes (...) KHÔNG hoạt động bình thường ngay cả trên ICS +
lạ

Tôi không thể tìm thấy EncodingUtils ở đâu?
behelit

1
@behelit nếu bạn theo liên kết của tôi, nó sẽ chuyển hướng đến bit này: developer.android.com/about/versions/marshmallow/… Về cơ bản, nói rằng bạn cần phải bao gồm thư viện Apache HTTP theo cách thủ công vì nó hiện không được dùng nữa.
dain

Nhưng nếu bạn chỉ đang tìm kiếm tài liệu, tìm kiếm "apache http encodingutils" sẽ cho một số kết quả hữu ích như: hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/…
dain

3

Trong chuỗi của tôi, tôi có các ký tự tiếng Thái (được mã hóa TIS620) và âm sắc tiếng Đức. Câu trả lời từ agiles đưa tôi vào con đường đúng đắn. Thay vì .getBytes () tôi sử dụng bây giờ

  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

Chuyển đổi chuỗi thành giá trị 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);
   }


-2

Thử cái này:

/**
 * @(#)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();
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.