В какой кодировке хранятся строки в java
привет всем.
Есть объект типа String.
необходимо узнать символьное название кодировки, в которой находится содежржимое данного обекта, для того чтобы в последствии перекодировать другие строки в такую же кодировку.
Re: как узнать в какой кодировке строка?
| От: | Blazkowicz |
| Дата: | 07.12.05 09:27 |
| Оценка: |
Здравствуйте, hl-man, Вы писали:
HM>привет всем.
HM>Есть объект типа String.
HM>необходимо узнать символьное название кодировки, в которой находится содежржимое данного обекта, для того чтобы в последствии перекодировать другие строки в такую же кодировку.
Объект типа String хранит значения в кодировке UTF. А другие кодировки используются при трансформации строки в двоичное представление и обратно.
А вообще подобный вопрос уже где-то проскакивал и если мне не изменяет память в общем случае задача решения не имеет. ИМХО, понадобится отдельный анализ под каждую используемую кодировку.
Re[2]: как узнать в какой кодировке строка?
| От: | aefimov | http://twitter.com/#!/aefimov_box |
| Дата: | 07.12.05 09:34 | |
| Оценка: | 2 (2) +1 | |
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, hl-man, Вы писали:
HM>>привет всем.
HM>>Есть объект типа String.
HM>>необходимо узнать символьное название кодировки, в которой находится содежржимое данного обекта, для того чтобы в последствии перекодировать другие строки в такую же кодировку.
Кодировка имеет значение не для строк и символов, а для массива байтов, чтоб этот массив байтов пересести в строки и символы. соответственно вы не тем занимаетесь — в строках никакой кодировки нет вообще.
B>Объект типа String хранит значения в кодировке UTF. А другие кодировки используются при трансформации строки в двоичное представление и обратно.
B>А вообще подобный вопрос уже где-то проскакивал и если мне не изменяет память в общем случае задача решения не имеет. ИМХО, понадобится отдельный анализ под каждую используемую кодировку.
Не в UTF, а в Unicode. И даже это не верно — в строке нет никакой кодировки. char может гдето внутри и хранит данные в 16битах, а потом небось будет хранить в 32х, но это char, а не byte
Re[3]: как узнать в какой кодировке строка?
| От: | Blazkowicz |
| Дата: | 07.12.05 09:40 |
| Оценка: |
Здравствуйте, aefimov, Вы писали:
B>>А вообще подобный вопрос уже где-то проскакивал и если мне не изменяет память в общем случае задача решения не имеет. ИМХО, понадобится отдельный анализ под каждую используемую кодировку.
A>Не в UTF, а в Unicode. И даже это не верно — в строке нет никакой кодировки. char может гдето внутри и хранит данные в 16битах, а потом небось будет хранить в 32х, но это char, а не byte
Re: как узнать в какой кодировке строка?
| От: | StanislavK |
| Дата: | 07.12.05 09:40 |
| Оценка: |
Здравствуйте, hl-man, Вы писали:
HM>привет всем.
HM>Есть объект типа String.
HM>необходимо узнать символьное название кодировки, в которой находится содежржимое данного обекта, для того чтобы в последствии перекодировать другие строки в такую же кодировку.
В java строки Unicode-ные. Понятие кодировки может быть применено только к массиву байт.
Re[3]: как узнать в какой кодировке строка?
| От: | Lucker | http://lucker.intervelopers.com/ |
| Дата: | 07.12.05 12:12 | |
| Оценка: |
Здравствуйте, aefimov, Вы писали:
A>И даже это не верно — в строке нет никакой кодировки. char может гдето внутри и хранит данные в 16битах, а потом небось будет хранить в 32х, но это char, а не byte
Ну как тебе сказать. В спеке, по крайней мере, сказано — что char — это 16 бит, представляющих символы Unicode. Т.е каждое конкретное значение — это конкретный код конкретного символа из конкретной кодировки.
В какой кодировке хранятся строки в Java? Как преобразовать строку из UTF-8 в Windows-1251?
Строки в java хранятся в Unicode. Для того что бы собрать строку в кодировке windows-1251 для неё нужно подготовить «правильные» байты.
public class Test < public static void main(String[] args) throws IOException < BufferedReader is = new BufferedReader(new InputStreamReader(new FileInputStream("/home/maks/myFile"))); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/home/maks/myFileout"))); while(is.ready())< byte[] byte1251 = is.readLine().getBytes("windows-1251"); String outString = new String(byte1251,"windows-1251"); System.out.println(outString); bw.write(outString); bw.newLine(); >is.close(); bw.flush(); bw.close(); > >
Понравилась статья? Поделиться с друзьями:
Вам также может быть интересно
кодировка строк в Java
Учу Java . При написании кода потребовалось перекодировать полученную строку. После того, как я прочитал об этом несколько постов и статей — я понял, что в Java строки не имеют понятия кодировки, и, если хочешь ее изменить, то нужно из строки сделать байтовый массив, в массиве поменять кодировку и полученное значение вернуть назад в строку. Получилось что то типа такого:
String data = "Текст который получаю"; data = new String (arr.getBytes("utf8"), "utf8");
- Правильно ли я все понял?
- Правильно ли я реализую это в коде?
Отслеживать
user236980
задан 26 янв 2018 в 2:44
Fariz Mamedow Fariz Mamedow
1,447 2 2 золотых знака 10 10 серебряных знаков 21 21 бронзовый знак
Вы сами ответили на свой вопрос. Есть переменная типа String, соответсвенно, String -обычный класс, который по сути инкапсулирует массив чаров и никакой переменой, хранящей информацию о кодировке там нет, в чем легко убедиться заглянув в сорцы. Поэтому ваши танцы с бубном в виде создания новой переменной типа String ни к чему не приведут. Эта переменная как не хранила инфу о кодировке,так и продолжит ее не хранить, что бы вы не делали.И это правильно, зачем создавать путаницу внутри самой Java.Вопрос кодировки возникнет тогда, когда вы работаете с внешним ресурсом-сайтом,текстовым файлом,бд.
26 янв 2018 в 3:34
@ДмитрийАлександрович да работаю с внешним ресурсом изза этого вопрос. Но не понял верхний код правильно перекодирует или как?
26 янв 2018 в 8:35
Строки не имеют понятия кодировки, поэтому «перекодировать строку» не имеет смысла. Кодировка бывает лишь в момент превращения строки в байты и назад. Расскажите свою настоящую задачу.
26 янв 2018 в 8:45
Если вы конвертируете байты из файла в строку неправильно, ничего не нужно делать со строкой. Просто сконвертируйте правильно.
26 янв 2018 в 8:47
@VladD задача такая что при соеденение с сокетам русские символы превразаются в чефырчку
26 янв 2018 в 8:56
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Кодировка это просто таблица, где каждой букве соответсвует число (помним же, что компьютер хранит только числа?). Поэтому кодировка имеет смысл только в том случае когда массив чисел (byte[], например) нам нужно превратить в строку и нужно понимать с какой буквой ассоциировать каждое число (ну или в обратную сторону).
Таким образом кодировка имеет смысл только при преобразовании в массив байтов или наоборот. Ваша запись в сокет это оно и есть.
Грубо говоря вы прочитали из сокета массив байтов:
byte[] data = socket.read();
Дальше нам нужно этои числа интрпретировать как строку, с правильной таблицей (кодировкой). В этом случае кодировка показывают в какую букву будет преобразовано каждое число:
new String(data, "UTF-8");
И наоборот у нас есть строка, и мы хотим преобразовать её к массиву байтов, мы указываем кодировку, то бишь в какое число будет преобразована каждая буковка:
String data = "abc"; byte[] array = data.getBytes("UTF-8"); socket.write(array);
Если у вас проблемы с русскими буквами — значит скорее всего указали неправильную кодировку. Какую нужно указывать — нужно разбирать что вам собственно приходит из сокета.
В какой кодировке хранятся строки в java
[an error occurred while processing this directive]
Java и Unicode
[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive] (none)
[an error occurred while processing this directive] ([an error occurred while processing this directive] Сергей Семихатов [an error occurred while processing this directive])
[an error occurred while processing this directive](none)
- Аннотация
- Java по-русски
- Русский текст из внешнего источника
- Unicode и Java
- MBCS
- Unicode
Аннотация
Как известно, Java использует представление строк в формате Unicode. В этой статье речь пойдет о способах хранения и представления данных, записанных в разных кодировках.
Java по-русски
Написать java-апплет, выводящий приветствие на русском языке очень просто. Можно вставить строку с русским языком прямо внутрь текста класса:
String labelName = "Привет!"; JLabel myLabel = new JLabel(labelName);
Однако не факт, что это будет работать. Ведь тот русский текст, который был набран в редакторе, мог существовать практически в любой кодировке (DOS/Win/UNIX). Исходный текст программы обычно представлен в 8-битном формате, а один символ (char) в java занимает 2 байта (это связано с тем, что язык java ориентирован на поддержку и на работу с Unicode). Таким образом при компиляции программы происходит преобразование символов из одной кодировки (кодировки редактора) в другую (Unicode).
Это преобразование (перекодировка) основывается на том, что исходный текст программы написан в той же кодировке, что и базовая кодировка Java Virtual Machine (JVM), которая, как правило, совпадает с кодировкой самой операционной системы (для русских Windows это будет Cp1251). Таким образом, если кодировка кириллицы в редакторе совпала с кодировкой кириллицы в системе, то сообщение «Привет!» появится в нормальном виде.
Чтобы избежать путаницы с кодировками русского языка в тексте программы, у компилятора javac есть специальный параметр encoding , который определяет кодировку исходного текста программы.
Есть и другой способ. Русские буквы в тексте программы можно указывать в формате `\uXXXX’ (где XXXX — шестнадцатиричный код символа в стандарте Unicode). В комплект JDK входит утилита native2ascii , которая позволяет перевести текст из любой поддерживаемых JDK кодировок в ASCII-вид, а символы, не имеющие отображения в ASCII, представить в `\uXXXX’ виде. Узнать код того или иного символа кириллицы в Unicode можно, запустив программу charmap в WindowsNT.
Русский текст из внешнего источника
Как показать русский текст из внешнего источника, например файла? Текст в файле хранится, как правило, в 8-битном формате. Для чтения/записи и преобразования набора байт в строку и обратно используются специальные классы из пакета java.io : InputStreamReader и OutputStreamReader.
Эти два класса специально предназначены для преобразования потока байт в указанной кодировке (чем по умолчанию является кодировка системы) в Unicode строку java.
Вот типичный пример создания «читателя» из файла:
FileInputStream fis = new FileInputStream("priwet.txt"); InputStreamReader isr = new InputStreamReader(fis, "Cp1251"); Reader in = new BufferedReader(isr);Unicode и Java
Предположим, однако, что необходимо работать с внешним текстом (или данными) не только в русской, а в любой кодировке. Эту проблему можно решить двумя способами: храня внешние данные в формате Unicode или же в формате MBCS (MultiByte Character Set).
MBCS
Несмотря на то, что Unicode был специально разработан для поддержки многих языков, использовать его для хранения и передачи строк в Америке и большей части Европы неэффективно, потому что для этих регионов достаточно 256, а иногда всего 128 символов. Ведь первые 128 символов Unicode (\u0000 — \u007F) совпадают с ISO-646, а первые 256 символов (\u0000 — \u007F) совпадают с ISO-8859-1. Тем самым, используется только маленький кусочек всего спектра Unicode, ведь старший байт почти всегда равен нулю.
Возникает желание по-прежнему использовать Unicode внутри программы, но хранить и передавать данные в 8-битной кодировке, преобразуя данные непосредственно перед их получением или записью. В качестве записи в 8-битной кодировке можно использовать технологию MBCS, где каждый символ может занимать несколько байт.
Вопрос заключается в том, какой набор символов (кодировку) использовать для такого преобразования. Существующие кодировки не подходили для этой цели, поэтому Unicode Consortium выработал специальные кодировки для преобразования Unicode-строк в MBCS-строки. Эти кодировки носят название Unicode Transformation Format (UTF), и существуют в двух вариантах: UTF-7 и UTF-8. Они различаются количеством бит (7 или 8), используемых для кодирования.
Кодировка UTF-7 характерна тем, что часто требует больше байтов для представления данных, чем сам Unicode. Но эта кодировка необходима, так как многие старые системы (и не только, например, MIME) используют 7-битную кодировку символов.
Кодировка UTF-8, в свою очередь, очень хорошо подходит для хранения текста, который используют ASCII символы, и символы, чей Unicode код меньше \u0800. В этом спектре лежит большинство символов, используемых в европейских (соответственно, и американских) и ближневосточных странах. Для символов, чей код больше \u07FF, UTF-8, наоборот, мало подходит, потому что эти символы расплываются до 3 байт.
Алгоритмы конвертации между Unicode и UTF-7 или UTF-8 описаны в стандарте Unicode (The Unicode Standart).
Unicode
Чтобы узнать, как будет выглядеть текстовый файл в формате Unicode, можно запустить программу notepad в WindowsNT и при сохранении текстового файла поставить галочку «Сохранить в формате Unicode».
Рисунок 1.
Так как каждый символ занимает 2 байта, то возникает проблема, в каком порядке они должны быть записаны. Рассмотрим строку «Привет!». Возможны два варианта:
-
младший байт впереди (little endian)
04 40 04 38 04 32 04 35 04 42 04 21 00
40 04 38 04 32 04 35 04 42 04 21 04 00
Какой из вариантов является правильным? В стандарте Unicode написано, что порядок байт по умолчанию является либо big endian, либо little endian 🙂
Действительно, оба порядка являются правильным, и разработчики систем сами выбирают себе один из них. Так что нечего беспокоиться, если ваша Windows NT Workstation обменивается данными с Windows NT Server — они обе используют little endian.
Однако, если ваша Windows NT Workstation обменивается данными с UNIX-сервером, который использует big endian, одна из систем должна осуществлять перекодировку. В этом случае стандарт Unicode гласит, что можно выбрать любой из следующих способов решения проблемы:
- Когда две системы, использующие различный порядок представления байт в Unicode, обмениваются данными (не используя каких-то специальных протоколов), то порядок байт должен быть big endian. В стандарте это называется каноническим порядком байт. Однако второй способ является более универсальным и предпочтительным:
- Каждая строка Unicode должна начинаться с кода \uFEFF, который в стандарте называется «знаком порядка» (byte order mark) или «zero-width nonbreaking space». Код \uFFFE, который является «перевертыванием» знака порядка, не обозначает ничего (так он зарезервирован в стандарте Unicode). Поэтому если получатель видит в качестве первого символа код \uFEFF, то это значит, что байты находятся в перевернутом (little endian) порядке.
Вот как выглядит файл со строкой «Привет!», сохраненный в формате Unicode:

Рисунок 2.
Для чтения данных, записанных как в формате MBCS (используя кодировку UTF-8), так и в формате Unicode, можно использовать все тот же класс InputStreamReader из пакета java.io , подставляя в его конструктор различные кодировки. В описании пакета java.lang написано, что каждая реализация JVM должна поддерживать следующие кодировки:
US-ASCII семибитная ASCII, она же ISO646-US, она же основная латинская часть Unicode; ISO-8859-1 то же самое, что ISO-LATIN-1; UTF-8 8-битный Unicode Transformation Format; UTF-16BE 16-битный Unicode Transformation Format, порядок байт big-endian; UTF-16LE 16-битный Unicode Transformation Format, порядок байт little-endian; UTF-16 16-битный Unicode Transformation Format, порядок байт определяется начальными значениями (допускается любой), на выходе порядок байт big-endian. Для чтения файла в формате Unicode надо использовать значение «UTF-16», а для чтения файла в формате UTF-8 — использовать «UTF-8»:
FileInputStream fis = new FileInputStream("priwet_u.txt"); InputStreamReader isr = new InputStreamReader(fis, "UTF-16");Преобразование между строками и потоком байт
В java для преобразования потока байт (byte[]) в строку (String) и обратно, в классе String есть следующие возможности:
- Конструктор String(byte[] bytes, String enc) получает на вход поток байт с указанием их кодировки; если кодировку опустить то она будет принята по умолчанию
- Метод getBytes(String enc) возвращает поток байт, записанных в указанной кодировке; кодировку также можно опустить.
try < String priwet = new String( "\u041F"+"\u0440"+"\u0438"+ "\u0432"+"\u0435"+"\u0442"+"!"); byte[] utf8Bytes = priwet.getBytes("UTF8"); String priwet2 = new String(utf8Bytes,"UTF8"); >catch (UnsupportedEncodingException e)
[an error occurred while processing this directive]
[an error occurred while processing this directive] (none)- Статьи
- Java: Русские буквы и не только.
- Почтовая программа — своими руками!
- LiveConnect: руководство для IE
- Доступ к COM порту из Java приложения
- Технологии построения распределенных объектных систем
- Java и Unicode
- Простое CORBA приложение — своими руками
- Разработка Java приложений для Lotus Notes
- Множественное наследование в Java. Противоречия и способы их решения
- Динамическая связь интерфейсов и реализации в JDK 1.3
- Оптимизация загрузки классов
- Реализация алгоритма вычисления CRC-16 средствами Java2 для передачи данных по протоколу MODBUS режим RTU
- Анализ покрытия как метод улучшения качества кода
- Использование аннотаций в J2SE 5
- Использование параметризуемых классов в J2SE 5
- Конфигурация JAVA приложения с помощью XML
< Вернуться на caйт:: Copyright © 1999 — 2010, IT • archiv.
