2010-12-08 3 views
121

В java, если у меня есть строка x Как я могу вычислить количество байтов в этой строке?байтов строки в java?

+11

Возможно, вы захотите использовать String для представления тела ответа HTTP и использовать размер для установки заголовка Content-Length, который указан в октетах/байтах, а не в символах. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13 – iX3 2012-12-18 20:58:46

+2

В столбце базы данных может быть ограничение длины в байтах, например. VARCHAR2 (4000 BYTE) в Oracle. Возможно, вам захочется узнать количество байтов строки в желаемой кодировке, чтобы узнать, подходит ли строка. – Somu 2013-06-04 06:09:38

+0

@ iX3 Точно так же, как я пытался это сделать. – 2013-06-28 10:47:54

ответ

15

По How to convert Strings to and from UTF8 byte arrays in Java:

String s = "some text here"; 
byte[] b = s.getBytes("UTF-8"); 
System.out.println(b.length); 
+0

но извините меня, когда я скомпилирую ваш код, он дает мне ошибку; из-за параметра «UTF-8». где, когда я передаю пустой параметр, он дает мне такую ​​же длину, как x.length. я неправильно понимаю концепцию. помогите пожалуйста – Green 2010-12-08 09:19:29

4

Там есть метод, называемый getBytes(). Использовать его мудро .

225

Строка представляет собой список символов (то есть кодовые точки). Количество байтов, принятых для представления строки , полностью зависит от того, какую кодировку вы используете, чтобы превратить ее в байты.

Тем не менее, вы можете превратить строку в массив байтов, а затем посмотреть на его размер следующим образом:

// The input string for this test 
final String string = "Hello World"; 

// Check length, in characters 
System.out.println(string.length()); // prints "11" 

// Check encoded sizes 
final byte[] utf8Bytes = string.getBytes("UTF-8"); 
System.out.println(utf8Bytes.length); // prints "11" 

final byte[] utf16Bytes= string.getBytes("UTF-16"); 
System.out.println(utf16Bytes.length); // prints "24" 

final byte[] utf32Bytes = string.getBytes("UTF-32"); 
System.out.println(utf32Bytes.length); // prints "44" 

final byte[] isoBytes = string.getBytes("ISO-8859-1"); 
System.out.println(isoBytes.length); // prints "11" 

final byte[] winBytes = string.getBytes("CP1252"); 
System.out.println(winBytes.length); // prints "11" 

Итак, вы видите, даже простое «ASCII» строка может иметь различное количество байтов в его представление, в зависимости от того, какое кодирование используется. Используйте любой символ, который вас интересует для вашего дела, в качестве аргумента getBytes(). И не попадают в ловушку, предполагая, что UTF-8 представляет каждый символ в виде одного байта, так как это не так как:

final String interesting = "\uF93D\uF936\uF949\uF942"; // Chinese ideograms 

// Check length, in characters 
System.out.println(interesting.length()); // prints "4" 

// Check encoded sizes 
final byte[] utf8Bytes = interesting.getBytes("UTF-8"); 
System.out.println(utf8Bytes.length); // prints "12" 

final byte[] utf16Bytes= interesting.getBytes("UTF-16"); 
System.out.println(utf16Bytes.length); // prints "10" 

final byte[] utf32Bytes = interesting.getBytes("UTF-32"); 
System.out.println(utf32Bytes.length); // prints "16" 

final byte[] isoBytes = interesting.getBytes("ISO-8859-1"); 
System.out.println(isoBytes.length); // prints "4" (probably encoded "????") 

final byte[] winBytes = interesting.getBytes("CP1252"); 
System.out.println(winBytes.length); // prints "4" (probably encoded "????") 

(Обратите внимание, что если вы не обеспечивают набор символов аргумента , по умолчанию персонаж платформы установлен используется. Это может быть полезно в некоторых случаях, но в целом следует избегать в зависимости от значения по умолчанию, и всегда использовать явный набор символов, когда требуется кодирование/декодирование.)

3

Попробуйте это :

Bytes.toBytes(x).length 

Предполагая, что вы объявили и инициализировали x до

6

A String экземпляр выделяет определенное количество байтов в памяти. Может быть, вы смотрите на что-то вроде sizeof("Hello World"), которое вернет количество байтов, выделяемых самой структурой данных?

В Java, как правило, нет необходимости в функции sizeof, потому что мы никогда не выделяем память для хранения структуры данных. Мы можем посмотреть файл String.java для приблизительной оценки, и мы увидим некоторые «int», некоторые ссылки и char[]. Java language specification определяет, что char варьируется от 0 до 65535, поэтому для сохранения одного символа в памяти достаточно двух байтов. Но JVM не должен хранить один символ в 2 байтах, он должен только гарантировать, что реализация char может содержать значения заданного диапазона.

Так что sizeof действительно не имеет никакого смысла в Java. Но, предполагая, что у нас есть большая строка, а одна char выделяет два байта, тогда размер памяти объекта String составляет не менее 2 * str.length() в байтах.

12

педантичный ответ (хотя и не обязательно является наиболее полезным, в зависимости от того, что вы хотите сделать с результатом) является:

string.length() * 2 

Java строки физически хранятся в UTF-16BE кодирования, который использует 2 байта на код блока и String.length() измеряет длину в UTF-16 кодовых блоков, так что это эквивалентно:

final byte[] utf16Bytes= string.getBytes("UTF-16BE"); 
System.out.println(utf16Bytes.length); 

и это покажет вам размер внутреннего char массива, в байт.

Примечание: "UTF-16" даст другой результат от "UTF-16BE", поскольку прежняя кодировка введет BOM, добавив 2 байта к длине массива.

38

Если вы работаете с 64-битными ссылками:

sizeof(string) = 
8 + // object header used by the VM 
8 + // 64-bit reference to char array (value) 
8 + string.length() * 2 + // character array itself (object header + 16-bit chars) 
4 + // offset integer 
4 + // count integer 
4 + // cached hash code 

Другими словами:

sizeof(string) = 36 + string.length() * 2 

На 32-битной виртуальной машине или 64-разрядную виртуальной машину со сжатым упсом (- XX: + UseCompressedOops), ссылки - 4 байта. Таким образом, общая сумма будет равна:

sizeof(string) = 32 + string.length() * 2 

Это не учитывает ссылки на строковый объект.

Смежные вопросы