如何将Java字符串转换为ASCII字节数组?


Answers:


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”(à))转换为“?”。有一种将其转换为“ a”的方法会更好。
Arnout Engelen'1

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);
               ^

注意大写的“ String”。这尝试在字符串类上调用静态方法,该方法不存在。相反,您需要在字符串实例上调用该方法:

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

如果是这样,您能告诉我一个希伯来字母怎么会占用1个字节(ASCII编码),它甚至不存在于ASCII中。而且由于我手动指定,因此它没有使用默认编码。 i.stack.imgur.com/5WPD3.jpg
Royi Namir

@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");

1
这实际上是一个很好的提示!在Android上,即使在ICS +上,getBytes(...)也无法正常工作
奇怪的

我在任何地方都找不到EncodingUtils?
behelit '16

1
@behelit,如果您点击我的链接,它将重定向到以下位置:developer.android.com/about/versions/marshmallow / ... 基本上,您需要手动包含Apache HTTP库,因为它现在已过时。
dain

但是,如果您只是在寻找文档,则搜索“ apache http encodingutils”会得到一些有用的结果,例如:hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/…–
dain

3

在我的字符串中,我有泰语字符(编码为TIS620)和德国变音符。阿吉尔斯的答案使我走上了正确的道路。我现在使用的不是.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);
   }


-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();
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.