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

87

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

11个回答

165

使用getBytes方法,传递正确的Charset(或Charset名称)。

例如:

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

如果需要更多的控制(例如在遇到7位US-ASCII之外的字符时抛出异常),则可以使用CharsetDecoder

private static byte[] strictStringToBytes(String s, Charset charset) throws CharacterCodingException {
    ByteBuffer x  = charset.newEncoder().onMalformedInput(CodingErrorAction.REPORT).encode(CharBuffer.wrap(s));
    byte[] b = new byte[x.remaining()];
    x.get(b);
    return b;
 }

在Java 7之前,可以使用以下代码:byte[] b = s.getBytes("US-ASCII");。Java 7引入了StandardCharsets枚举、编码器以及专门的getBytes(Charset)方法。


10
我对那件事情的轻松程度感到有些尴尬。 - farm ostrich
4
这将把无法映射的字符,例如'\u00e0'(à),转换为'?'。最好有一种方法可以将其转换为'a'。 - Arnout Engelen
11
对于使用Java 7或更高版本的用户,请使用类StandardCharsets,该类包含一些标准字符集的常量。byte[] b = s.getBytes(StandardCharsets.US_ASCII); - Alexis C.
getBytes(Charset) 是在 Java 6 中引入的。 - Dávid Horváth

23
如果您是Guava的用户,那么有一个方便的Charsets类可用:Charsets
String s = "Hello, world!";
byte[] b = s.getBytes(Charsets.US_ASCII);

在你的源代码中,除了不要硬编码任意字符集名称之外,它还有一个更大的优点:Charsets.US_ASCIICharset 类型(而不是 String),因此你避免了从 String.getBytes(String) 抛出的已检查的 UnsupportedEncodingException,但不会从 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中。并且它也没有使用默认编码,因为我手动指定了。http://i.stack.imgur.com/5WPD3.jpg - Royi Namir
@RoyiNamir:这可能更适合作为一个新问题发布,但原因是该字符无法在US-ASCII中编码,而getBytes(Charset)方法被指定为替换无法编码的字符。对于US-ASCII,这个替换字符是问号,所以你的字节数组包含一个元素,其ASCII值为'?'(63)。 - Jörn Horstmann

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(...)也无法正常工作。 - strange
我找不到EncodingUtils在哪里? - behelit
1
@behelit 如果你跟随我的链接,它会重定向到这个页面:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client基本上说,现在已经弃用了Apache HTTP库,所以你需要手动包含它。 - dain
但是,如果你只是在寻找文档,搜索“apache http encodingutils”会给出一些有用的结果,例如:https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/util/EncodingUtils.html - dain

4

我字符串中有泰语字符(使用TIS620编码)和德语umlauts字符。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;
  }

也许有点晚了,但这对我非常有效(试图将德语UTF-8特殊字符转换为ASCII)。非常感谢!你让我的一天 :D - Max

0

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

将字符串转换为ASCII字节数组:

String s1 = "Hello World!";
byte[] byteArray = s1.getBytes(StandardCharsets.US_ASCII);
// Now byteArray is [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

将ASCII字节数组转换为字符串:

String s2 = new String(byteArray, StandardCharsets.US_ASCII));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接