Getbytes utf 8 java - IT Справочник
Llscompany.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Getbytes utf 8 java

Getbytes utf 8 java

Could anyone explain please why

displays «1» (not using BOM), but

displays «4» (using BOM FEFF + 0041 I suppose).

In both UTF-8 and UTF-16, the character ‘A’ is encoded using 1 code unit. UTF-8 uses 1 byte per code unit, and UTF-16 uses 2 bytes per code unit. The «UTF-16» encoding also adds a two byte BOM to the start.

If you don’t want to use the BOM, you have to use either «UTF-16LE», or «UTF-16BE».

. and welcome to the Ranch

This discussion is too difficult for the “Beginning” forum, so I shall move it.

Thank you

But why then some other symbols need so many bytes?

The result is «5» in this case.

It doesn’t. The Cyrillic letter Che uses 2 code units in UTF-8.

UTF-8 uses a variable number of bytes to encode characters. If it only needed one byte per character, it would only be able to map 256 characters. Instead, it uses an elaborate scheme that uses more bytes for characters that are less widely used. For instance, ASCII characters are represented by one byte, while musical symbols require four bytes. Cyrillic requires 2 bytes.

Stephan van Hulst wrote: It doesn’t. The Cyrillic letter Che uses 2 code units in UTF-8.

Well, it does on my PC.
And the strange thing that sometimes it uses 5 bytes, sometimes 4 (13 or 12 bytes for «ЧЧЧ»). I’m quite sure results were different when I compiled it last time.

I found the problem: Java doesn’t recognize my Cyrillic letters
Does anyone know how to fix that?

Oh god, I fixed it. Kinda proud of myself

It’s working when I use «javac -encoding UTF-8 Test.java», but the main problem was that my Windows 7 didn’t recognize cyrillic symbols in text files.

Control Panel -> Region and Language -> Administrative -> Language for programs that do not support Unicode -> Russian

Aleksey Movchan wrote: . . . my Windows 7 didn’t recognize cyrillic symbols in text files. . . .

A common problem with the Windows® command line; it only supports a very restricted range of characters, not the same as this Unicode page plus ASCII.
Try the following instead of System.out.println:-
JOptionPane.showMessageDialog(null, "АБВГДЕ");
You have to import option pane: import javax.swing.JOptio‍nPane;

Great work, have a cow!

After fixing it, does the program return 2 bytes for Cyrillic characters in UTF-8?

That it returns 4 is strange and shouldn’t happen, but that it returns 5 should be downright impossible because the character ranges that require 5 and 6 bytes in UTF-8 are simply not defined.

I changed my «Region and Language» standards back to demonstrate you how it works on my computer with and without «-encoding UTF-8» flag.
Somehow it uses 5 bytes for letter «Ж»:

Because while the "Ж" string may appear to contain one character in your IDE, the Java compiler may interpret the source file using a different encoding, and the string may actually appear as a bunch of garbage characters that add up to 5 bytes when you encode it back to UTF-8.

You have 3 different encodings to consider here: The encoding your IDE uses to display the character on your screen, the encoding the compiler uses to interpret the source file, and the encoding that you tell String.getBytes() to use. If any of these don’t match, you’re going to end up with surprising results.

Try this: print "Ж".length() with and without specifying the source file encoding to your compiler, and see if the program really reports a string length of 1 character.

Aleksey Movchan wrote: Oh god, I fixed it. Kinda proud of myself

It’s working when I use «javac -encoding UTF-8 Test.java», but the main problem was that my Windows 7 didn’t recognize cyrillic symbols in text files.

Control Panel -> Region and Language -> Administrative -> Language for programs that do not support Unicode -> Russian

the problem is with the cmd console.I’ve writen an extensive article on its quirks which is targeted at Perl, although the concepts of the console are the same
Look in particular the ‘Console Input and Output’ section at the bottom of the link :
http://www.i-programmer.info/programming/other-languages/1973-unicode-issues-in-perl.html?start=1

«. we have to set the console to the correct codepage as well by using Win32::Console::OutputCP( 65001 ) and enable Unicode support by switching Win32::OLE to the UTF8 codepage (CP => Win32::OLE::CP_UTF8()).»

UTF-8 и UTF-16 в Java

Я действительно ожидаю, что байтовые данные ниже должны отображаться по-разному, но на самом деле они одинаковы, согласно wiki http://en.wikipedia.org/wiki/UTF-8#Examples, кодировка в байте выглядит по-другому, но почему Java распечатывает их как то же самое?

4 ответов

хотя Java содержит символы внутри как UTF-16, при преобразовании в байты с помощью String.getBytes() , каждый символ преобразуется с использованием кодировки платформы по умолчанию, которая, вероятно, будет чем-то вроде windows-1252. Результаты, которые я получаю:

это означает, что кодировка по умолчанию — «UTF-8» в моей системе.

также обратите внимание, что документация для String.getBytes () имеет этот комментарий: The behavior of this method when this string cannot be encoded in the default charset is unspecified.

в целом, хотя, вы избежите путаницы, если вы всегда указываете кодировку, как вы делаете с a.getBytes(«UTF-8»)

кроме того, еще одна вещь, которая может вызвать путаницу, включает символы Unicode непосредственно в исходный файл: String a = «€»; . Этот символ евро должен быть закодирован для хранения в виде одного или нескольких байтов в файле. Когда Java компилирует вашу программу, она видит эти байты и декодирует их обратно в символ евро. Ты надеешься. Вы должны быть уверены, что программное обеспечение, которое сохраняет символ евро в файл (Блокнот, eclipse и т. д.) кодирует его так же, как Java ожидает, когда он читает его обратно. UTF-8 становится все более популярным, но он не является универсальным, и многие редакторы не будут писать файлы в UTF-8.

Читать еще:  Java lang nosuchmethodexception

одно любопытство, мне интересно, как JVM знает исходную кодировку по умолчанию .

механизм, который JVM использует для определения начальной кодировки по умолчанию, специфичен для платформы. В UNIX / UNIX-подобных системах он определяется переменными среды LANG и LC_*; см. man locale .

Ermmm.. Эта команда используется для проверки того, что такое кодировка по умолчанию в конкретной ОС?

это правильно. Но я говорил тебе . об этом, потому что ручная запись описывает как кодировка по умолчанию определяется переменными среды.

в ретроспективе это может быть не то, что вы имели в виду под своим оригинальным комментарием, но так указана кодировка платформы по умолчанию. (И концепция «набора символов по умолчанию» для отдельного файла бессмысленна; см. ниже.)

Что делать, если у меня есть исходный файл 10 Java, половина из них сохраняется как UTF-8, а остальные сохраняют как UTF-16, после компиляции я перемещаю их (файл класса) в другую платформу ОС, теперь как JVM знает их кодировку по умолчанию? Будет ли информация о кодировке по умолчанию включена в файл класса Java?

Это довольно запутанный набор вопросов:

текстовый файл не имеет набора символов по умолчанию. Он имеет набор символов / кодировку.

нетекстовый файл вообще не имеет кодировки символов. Концепция бессмысленный.

нет 100% надежного способа определить, что такое кодировка символов текстового файла.

Если вы не скажете компилятору java, что такое кодировка файла, он будет считать, что это кодировка платформы по умолчанию. Компилятор не пытается вас переубедить. Если кодировка получена неправильно, компилятор может заметить или даже не заметить вашу ошибку.

байт-код («.класса») файлы двоичные файлы (см. 2).

когда символьные и строковые литералы компилируются в».класс » файл, они теперь представлены таким образом, что не зависит от кодировки платформы по умолчанию, или что-нибудь еще, что вы можете повлиять.

Если вы допустили ошибку с кодировкой исходного файла при компиляции, вы не можете исправить ее на «.класс » уровень файла. Ваш единственный вариант-вернуться и перекомпилировать классы, сообщив компилятору Java правильная кодировка исходного файла.

«что, если, скажем, у меня есть исходный файл 10 Java, половина из них сохраняется как UTF-8, а остальные — как UTF-16».
Просто не делай этого!

  • не сохраняйте исходные файлы в смеси кодировок. Ты сведешь себя с ума.
  • я не могу ничего хорошего для хранения файлов в UTF-16 вообще .

Так, я запутался что, хотя люди говорят «зависит от платформы», это связано с исходным файлом?

зависимость от платформы означает, что она потенциально зависит от операционной системы, поставщика JVM и версии, оборудования и т. д.

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

Если это не так, как я могу объяснить явления выше? В любом случае, путаница выше расширяет мой вопрос на «Итак, что произойдет после компиляции исходного файла в файл класса, потому что файл класса может не содержать информацию о кодировке, поэтому теперь результат действительно зависит от «платформы», но не исходного файла больше?»

механизм платформы (например, переменные среды) определяет, что компилятор java видит как набор символов по умолчанию. Если вы не переопределите это (например, предоставив параметры компилятору java по команде строка), это то, что компилятор Java будет использовать в качестве набора символов исходного файла. Однако это может быть неправильной кодировкой исходных файлов; например, если вы создали их на другом компьютере с другим набором символов по умолчанию. И если компилятор java использует неправильный набор символов для декодирования ваших исходных файлов, он может поместить неправильные коды символов в «.файл класса.

The «.файлы класса » не зависят от платформы. Но если они созданы неправильно, потому что вы не сказали компилятору Java правильную кодировку для исходных файлов, поле «.class » файлы будут содержать неправильные символы.

почему вы имеете в виду :» концепция «набора символов по умолчанию» для отдельного файла бессмысленна»?

Я говорю это, потому что оно верно!

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

но мы можем контролировать, как мы хотим, чтобы текстовый файл хранился правильно? Даже используя Блокнот, есть возможность выбрать между кодировкой.

это правильно. И это вы говорите Блокноту, какой набор символов использовать для файла. Если вы этого не скажете, Notepad будет использовать набор символов по умолчанию для записи файла.

в блокноте есть немного черной магии, чтобы угадать, что такое кодировка символов, когда он читает текстовый файл. В основном, он смотрит на первый несколько байтов файла, чтобы увидеть, начинается ли он с метки порядка байтов UTF-16. Если он видит один, он может эвристически различать UTF-16, UTF-8 (генерируемый продуктом Microscoft) и «другой». Но он не может различать различные» другие » кодировки символов и не распознает как UTF-8 файл, который не начинается с маркера спецификации. (Спецификация в файле UTF-8-это соглашение, специфичное для Microsoft . и вызывает проблемы, если приложение Java читает файл и не знает пропустить символ BOM.)

в любом случае, проблемы не в написании исходного файла. Они происходят, когда компилятор Java считывает исходный файл с неправильной кодировкой символов.

вы работаете с плохой гипотеза. The getBytes() метод не использует кодировку UTF-16. Он использует кодировку платформы по умолчанию.

Вы можете запросить его с java.nio.charset.Charset.defaultCharset() метод. В моем случае это UTF-8 и должно быть то же самое для вас.

Читать еще:  Java install did not complete 1603

по умолчанию является либо UTF-8 или ISO-8859-1 Если кодировка платформы не найдена. Не UTF-16 . Таким образом, в конечном итоге вы делаете преобразование байтов в UTF-8 только. Вот почему byte[] матч Вы можете найти кодировку по умолчанию, используя

Java String getBytes Method

The Java String.getBytes method is one of the Java String Methods, which is to encode the given string into a sequence of bytes using the user-specified Charset and return Byte array.

In this article, we will show how to write the Java String getBytes method with an example. The syntax of the string.getBytes in Java Programming language is as shown below.

Java String getBytes syntax

The Java Programming Language provides three different getBytes methods to encode the string.

The following Java String getBytes method will not accept any argument and encode the given string into a sequence of bytes using the default charset.

Below Java getBytes method will accept Charset as an argument and encode the given string into a sequence of bytes using the user-specified Charset. It means we are allowing the user to specify the Charset (dynamic).

The following Java String getBytes method will accept Charset’s name as an argument and encode the given string into a sequence of bytes by invoking the specified charset name. It means we are calling the required Charset name (static).

Return Value

The Java String getBytes Method encodes this string into a sequence of bytes using the user-specified Charset, and it will store the result in a byte array.

TIP: Java String.getBytes Method throws UnsupportedEncodingException. So, it is always advisable to use Try catch block.

Java String getBytes Example 1

The Java String.getBytes method encodes the given string into a sequence of bytes and returns a byte array. In this Java program, We are going to encode the string using the platform default charset.

OUTPUT

TIP: Please refer to the ASCII Table to understand the byte values.

ANALYSIS

Within the Java String getBytes example, First, we declared two String variables str, str1, and assigned corresponding values using the following statement.

The following String getBytes statements will call the public byte [] getBytes () method to encode the above-specified string (str & str1) into a sequence of bytes. From the above screenshot, you can observe that both these statements are using the platform default charset.

The following statement is to print the Byte array elements to the output.

When the compiler reaches the above statement, the compiler will jump to the following function. From the below code snippet, you can observe that we used the Foreach Loop to iterate the Byte Array. Then we are printing every array element using the System.out.println statement.

Java String getBytes Example 2

In this Java program, we are going to encode the string using the available standard charsets (Providing Dynamic functionality to end-user).

OUTPUT

ANALYSIS

First, we declared a String variable str and assigned non-Unicode text using the following statement.

The following statements will call the public byte [] getBytes () method to encode the above-specified string (str) into a sequence of bytes. It is using the platform default charset.

It will call the public byte [] getBytes (Charset charset) method to encode the above-specified string (str) into a sequence of bytes using standard charset UTF-8.

The following String getBytes statements will call the public byte [] getBytes (Charset charset) method to encode the above-specified string (str) into a sequence of bytes using standard charset ISO-8859-1.

The following String getBytes statement is to convert the Byte array to string

NOTE: From the above screenshot, you can observe that the default charset and the standard charset ISO-8859-1 are returning the same result.

Java String getBytes Example 3

In this Java program, We are going to encode the string by calling the available standard charsets names (Static functionality).

OUTPUT

ANALYSIS

Within the String getBytes example, First, we declared a String variable str and assigned non-Unicode text.

It will call the public byte [] getBytes (String Charset_name) method to encode the above-specified string (str) into a sequence of bytes. It is calling the standard charset name UTF_16BE.

It will call the public byte [] getBytes (String Charset_name) method to encode the above-specified string (str) into a sequence of bytes. It is calling the standard charset name UTF_8.

Within the below Java String getBytes statement, we are assigning the default charset name.

The following statement is to convert the Byte array to string.

Как у меня сломался String.getBytes(UTF_8) и что я с этим делал

(спойлер) дебажил, дизасемблил и пришел к выводу что проблема в SSE инструкциях

Все началось с того что я писал Load тест на Java для внутреннего компонента системы над которой сейчас работаю. Тест создавал несколько потоков и пытался что-то выполнить очень много раз. В процессе выполнения иногда появлялись java.lang.ArrayIndexOutOfBoundsException: 0 ошибки на строчке очень похожей на эту:

Строчка конечно была другая, но после небольшого изучения удалось найти проблему именно в ней. В итоге был написан JMH бенчмарк:

Который падал после нескольких секунд работы со следующим исключением:

Я никогда не сталкивался с таким раньше, поэтому попробовал тривиальные решения вроде обновить JVM и перезагрузить компьютер, но это, разумеется, не помогло. Проблема возникала на моем MacBook Pro (13-inch, 2017) 3,5 GHz Intel Core i7 и не повторялась на машинах коллег. Не найдя других факторов я решил изучать код дальше.

Читать еще:  Java lang void

Проблема возникала внутри JVM класса StringCoding в методе encode():

Массив ba в редких случаях создавался длинной в 0 элементов и это и вызывало ошибку в дальнейшем.

Я попробовал убрав зависимость от UTF_8, но это не получилось. Зависимость пришлось оставить, иначе проблема не воспроизводилась, но получилось убрать много лишнего:

maxBytesPerChar возвращает константу из final поля равную 3.0, но сам метод в редких случаях (1 на 1000000000) возвращал 0. Вдвойне странно было то, что убрав каст в double метод отрабатывал как надо во всех случаях.

Я добавил опции JIT компилятора -XX:-TieredCompilation и -client но это никак не повлияло. В итоге я собрал hsdis-amd64.dylib под Мак, добавил опции -XX:PrintAssemblyOptions=intel, -XX:CompileCommand=print,*MyBenchmark.encode и -XX:CompileCommand=dontinline,*MyBenchmark.encode и начал сравнивать сгенерированный JIT’ом ассемблер для метода с кастом в double и без:

Одно из отличий было наличие инструкций vcvtss2sd и vcvttsd2si. Я переключился на C++ и решил воспроизвести последовательность на inline asm, но в процессе отладки выяснилось что clang компилятор с опцией -O0 использует cvtss2sd инструкцию при сравнении float != 1.0. В итоге все свелось к функции compare:

И эта функция в редких случаях возвращала false. Я написал небольшую обертку чтобы сосчитать процент ошибочных выполнений:

Результат был следующий: Iterations: 2147483647, errors: 111, second compare errors: 0. Интересно то, что повторная проверка никогда не выдавала ошибки.

Я отключил поддержку SSE у clang, функция compare стала выглядеть так:

И проблема больше не воспроизводилась. Из этого я могу сделать выводы что набор SSE инструкция не очень хорошо работает на моей системе.

Я работаю программистом больше 7 лет, а программирую больше 16 и за это время я привык доверять примитивным операциям. Она всегда работает и результат всегда одинаковый. Осознать что сравнение float’а в какой то момент может сломаться это конечно шок. И что с этим можно сделать кроме как заменить Мак не ясно.

Java String.getBytes(«UTF8») JavaScript аналоговый

Написанные там функции работают исправно, то есть pack(unpack(«string»)) уступает «string» . Но я хотел бы получить такой же результат, как «string».getBytes(«UTF8») дает в Java.

Вопрос в том, как сделать функцию, дающую ту же функциональность, что и Java getBytes(«UTF8») в JavaScript?

Для латинских строк unpack(str) из упомянутой выше статьи дает тот же результат, что и getBytes(«UTF8») , за исключением добавления 0 для нечетных позиций. Но с нелатинскими строками это работает совершенно по-другому, как мне кажется. Есть ли способ работать со строковыми данными в JavaScript, как это делает Java?

4 Ответов

Вам не нужно писать полный кодер UTF-8; существует гораздо более простая идиома JS для преобразования строки Юникода в строку байтов, представляющих UTF-8 единиц кода:

(Это работает, потому что нечетная кодировка, используемая escape / unescape , использует последовательности %xx hex для представления символов ISO-8859-1 с этим кодом, а не UTF-8, как это используется экранированием URI-компонента. Точно так же decodeURIComponent(escape(bytes)) идет в другом направлении.)

Так что если вы хотите получить массив из него это будет:

Вы можете использовать эту функцию ( gist ):

Если вы хотите получить отрицательные числа для значений свыше 127, как это делает преобразование Java в byte-to-int, вам нужно настроить константы и использовать

TextEncoder является частью кодировки жизненного уровня и, согласно записи Encoding API на панели управления Chromium, он поставляется в Firefox и будет поставляться в Chrome 38. Существует также полифилл для кодирования текста , доступный для других браузеров.

Приведенный ниже пример кода JavaScript возвращает значение Uint8Array , заполненное ожидаемыми значениями.

Более интересный пример, который лучше показывает UTF-8 заменяет in в string на îñ :

Следующая функция будет иметь дело с теми, кто выше U+FFFF.

Поскольку javascript текста находятся в UTF-16, два «characters» используются в строке для представления символа выше BMP, а charCodeAt возвращает соответствующий суррогатный код. fixedCharCodeAt обрабатывает это.

Похожие вопросы:

Я пишу работу Hadoop/HBase. Мне нужно было преобразовать Java String в массив байтов. Есть ли какие-то различия между Java String.getBytes() и Hadoop Bytes.toBytes() ?

Допустим, я получаю строку из java.sql.ResultSet.getString(1). И из этой строки я назвал String.getBytes(). Теперь независимо от кодировки, используемой базой данных, из которой был запрошен.

Может кто-нибудь дать мне учебник о том, как сделать аналоговый спидометр с Android? В настоящее время у меня есть скорость (get by GPS), но я не знаю, как сделать графическую часть.

Я читал некоторые документы о методе String.getBytes(Charset) в Java. Он используется для преобразования строки в массив байтов (тип байта может получить значение от -2^7 до 2^7-1). Как я уже знал.

Мне нужно закодировать строку в массив байтов, используя кодировку UTF-8. Я использую Google guava, у него есть класс Charsets, уже определяющий экземпляр Charset для кодировки UTF-8. У меня есть 2.

Я начинающий и самообучающийся в программировании Java. Итак, я хочу знать о разнице между String.length() и String.getBytes().length в Java. Что больше подходит для проверки длины строки?

Безопасно ли использовать String.getBytes() ? Что происходит, когда программа работает на разных системах с разными значениями по умолчанию charset? я полагаю, что могу получить разное содержимое.

У меня есть эта строка в java: test.message byte[] bytes = plaintext.getBytes(UTF-8); //result: [116, 101, 115, 116, 46, 109, 101, 115, 115, 97, 103, 101] Если я сделаю то же самое в javascript.

Мне нужно реализовать этот код Java в (неуправляемом) c++: byte[] b = string.getBytes(UTF8); Я новичок в c++, и не могу найти ничего, чтобы сделать это. Он должен быть независимым от платформы, если.

Я думаю, что самый простой способ объяснить мою проблему — это небольшой пример: Моя строка в начале: Pâtes , и результат должен быть: Pâtes . Что я получаю в результате по-прежнему Pâtes как я.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector