2011-04-16 220 views

回答

125

使用getBytes方法,給它適當的Charset(或Charset名稱)。

例子:

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

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

+9

我有點尷尬的多麼容易。 – 2011-04-16 16:54:28

+3

這會將'\ u00e0'(à)等不可映射的字符轉換爲'?'。有一種將其轉換爲'a'的方法會更好。 – 2012-01-02 13:11:19

+11

對於使用Java 7或更高版本的用戶,請使用包含標準常量的類[StandardCharsets](http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html)字符集。 'byte [] b = s.getBytes(StandardCharsets.US_ASCII);' – 2014-05-15 22:29:25

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

只有一個字錯在你嘗試代碼:

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

注意大寫「串」。這會嘗試在字符串類上調用一個不存在的靜態方法。相反,您需要調用字符串實例上的方法:

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

如果是這樣,你能告訴我一個希伯來字母是如何取1個字節(ascii編碼),它甚至不存在於ascii中。並且它不使用默認的編碼,因爲我手動指定。 http://i.stack.imgur.com/5WPD3.jpg – 2014-10-30 09:03:02

+0

@RoyiNamir:這可能會更好地發佈爲新問題,但原因是該字符在US-ASCII和getBytes(字符集)中不可編碼,方法被指定替換無法編碼的字符。對於US-ASCII,這個替換字符是問號,所以你的字節數組包含一個ASCII值爲'?'的元素。 (63)。 – 2014-10-30 11:55:00

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); 
    } 
5

問題與其他提出的解決方案是,他們要麼丟棄不能被直接映射到ASCII字符,或者像?標記字符替換它們。

您可能希望將重音字符轉換爲沒有重音的相同字符。有幾個技巧可以做到這一點(包括自己構建靜態映射表或利用爲unicode定義的現有「規範化」),但這些方法遠未完成。

最好的辦法是使用junidecode這個庫,它不能完成,但是它以最正常的將Unicode轉換爲ASCII的方式結合了大量經驗。

4

如果您正好需要這在Android和希望把它與任何東西比升級Froyo更早的版本,你也可以使用EncodingUtils.getAsciiBytes()

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

這實際上是一個很不錯的提示!在Android上getBytes(...)即使在ICS上也不能正常工作+ – strange 2013-03-21 01:35:10

+0

我無法在任何地方找到EncodingUtils? – behelit 2016-04-15 00:22:21

+1

@behelit如果你按照我的鏈接它重定向到這個位:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client 基本上說,您需要手動包含Apache HTTP庫,因爲它現在已被棄用。 – dain 2016-04-16 11:48:39

21

如果你是一個用戶有一個方便的Charsets類:

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

除了在源代碼中沒有硬編碼字符集的任意命名它具有更大的優勢:Charsets.US_ASCIICharset型(不String)所以你避免檢查UnsupportedEncodingException只從String.getBytes(String)拋出,但不是從String.getBytes(Charset)拋出。

在Java 7中有相當於StandardCharsets的類。

+0

不幸的是,'String.getBytes(Charset)'直到API 9 :(所以如果你想要定位Froyo和以上,你不能這樣做。 – yincrash 2012-09-07 19:15:31

-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(); 
     } 
    } 
} 
2

在我的字符串我有泰語字符(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; 
    } 
相關問題