неизвестные байты возвращаются методом getBytes () - PullRequest
5 голосов
/ 16 ноября 2010


import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Main {
 public static void main(String[] args)
 {
  try 
  {
   String s = "s";
   System.out.println( Arrays.toString( s.getBytes("utf8") ) );
   System.out.println( Arrays.toString( s.getBytes("utf16") ) );
   System.out.println( Arrays.toString( s.getBytes("utf32") ) );
  }  
  catch (UnsupportedEncodingException e) 
  {
   e.printStackTrace();
  }
 }
}

Консоль:


[115]
[-2, -1, 0, 115]
[0, 0, 0, 115]

Что это?

[- 2, -1] - ???

Также я заметил, что если я это сделаю:


String s = new String(new char[]{'\u1251'});
System.out.println( Arrays.toString( s.getBytes("utf8") ) );
System.out.println( Arrays.toString( s.getBytes("utf16") ) );
System.out.println( Arrays.toString( s.getBytes("utf32") ) );

Консоль:


[-31, -119, -111]
[-2, -1, 18, 81]
[0, 0, 18, 81]

Ответы [ 4 ]

8 голосов
/ 16 ноября 2010

Не забывайте, что байты не подписаны в Java. Таким образом, -2, -1 на самом деле означает 0xfe 0xff ... и U + FEFF - это Unicode знак порядка байтов (BOM) ... это то, что вы видите здесь в версии UTF-16.

Чтобы избежать получения спецификации при кодировании, явно используйте UTF-16BE или UTF-16LE. (Я бы также предложил использовать имена, которые гарантированы платформой , а не просто "utf8" и т. Д. По общему признанию, имя гарантированно будет найдено без учета регистра, но отсутствие дефиса делает его менее надежным и нет никаких недостатков в использовании канонического имени.)

5 голосов
/ 16 ноября 2010

-2, -1 - это порядковый номер байта (BOM - U + FEFF), который указывает, что следующий текст закодирован в формате UTF-16.

Вы, вероятно, получаете это, потому что, хотя существует только одна кодировка UTF8 и UTF32, есть две кодировки UTF16 UTF16LE и UTF16BE, где 2 байта в 16-битном значении хранятся в формате Big-Endian или Little Endian.

Поскольку возвращаемые значения равны 0xFE xFF, это говорит о том, что кодировка UTF16BE

2 голосов
/ 16 ноября 2010

Байт в java является типом со знаком, поэтому вполне нормально иметь отрицательные значения.

2 голосов
/ 16 ноября 2010

Загадочный -2, -1 - это UTF-16 Метка порядка байтов (BOM) .Другие отрицательные значения - просто байты.В Java тип byte подписан и варьируется от -128 до +127.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...