узнать код символа java
Узнать код символа java
Здравствуйте, Аноним, Вы писали:
А>Собственно сабж.
Какого символа? В какой кодировке?
Кстати, не пробовал JavaDoc’и для класса String смотреть? Или для класса Character?
| От: | DrZubr |
Дата: | 04.03.04 10:00 | |
Оценка: |
Здравствуйте, mikkri, Вы писали:
M>Здравствуйте, Аноним, Вы писали:
А>>Собственно сабж.
M>Какого символа? В какой кодировке?
M>Кстати, не пробовал JavaDoc’и для класса String смотреть? Или для класса Character?
Для начала просто хорошая книжка может помочь.
Предвидя саму проблему, могу предположить, что уважаемого Анонима устроит ответ вида:
| От: | Аноним |
Дата: | 04.03.04 10:33 | |
Оценка: |
Здравствуйте, DrZubr, Вы писали:
DZ>Здравствуйте, mikkri, Вы писали:
M>>Здравствуйте, Аноним, Вы писали:
А>>>Собственно сабж.
M>>Какого символа? В какой кодировке?
M>>Кстати, не пробовал JavaDoc’и для класса String смотреть? Или для класса Character?
DZ>Для начала просто хорошая книжка может помочь.
DZ>Предвидя саму проблему, могу предположить, что уважаемого Анонима устроит ответ вида:
DZ>
Функция str.charAt(i)) возвращает символ из строки str под номером i, а мне нужен именно код символа.
Например int i = UnknowFunction(‘1’); В итоге переменной i будет присвоено значение 49(код символа 1).
В С++ все намного проще: int i = (int)’1′;
Я не Ламер, я тока учусь
| От: | Аноним |
Дата: | 04.03.04 10:35 | |
Оценка: |
Здравствуйте, mikkri, Вы писали:
M>Здравствуйте, Аноним, Вы писали:
А>>Собственно сабж.
M>Какого символа? В какой кодировке?
M>Кстати, не пробовал JavaDoc’и для класса String смотреть? Или для класса Character?
Обычного символа в обычной ANSI кодировке. Смотрел классы String и Character, но там я ничего не нашел?
Здравствуйте, Аноним, Вы писали:
А>Функция str.charAt(i)) возвращает символ из строки str под номером i, а мне нужен именно код символа.
А>Например int i = UnknowFunction(‘1’); В итоге переменной i будет присвоено значение 49(код символа 1).
А>В С++ все намного проще: int i = (int)’1′;
Ага. Вот только ты не учел, что символ будет в кодировке Unicode16. Собственно, что ты хочешь сделать.
К примеру, есть у меня китайский иероглиф. Нафиг тебе его код?
А>Я не Ламер, я тока учусь
Похоже, ты успешно учишься быть ламером. По крайней мере советы ты игнорируешь.
| От: | Lucker | http://lucker.intervelopers.com/ |
Дата: | 04.03.04 10:46 | ||
Оценка: |
| От: | mikkri |
Дата: | 04.03.04 10:52 | |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Обычного символа в обычной ANSI кодировке. Смотрел классы String и Character, но там я ничего не нашел?
| От: | DrZubr |
Дата: | 04.03.04 11:37 | |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Функция str.charAt(i)) возвращает символ из строки str под номером i, а мне нужен именно код символа.
А>Например int i = UnknowFunction(‘1’); В итоге переменной i будет присвоено значение 49(код символа 1).
А>В С++ все намного проще: int i = (int)’1′;
А>Я не Ламер, я тока учусь
Дык а я тебе что написал. Ты хоть запускал тот пример.
Запусти это и получишь свое 49
В твоем тривиальном случае это то что надо.
Pro Java
Страницы
10 апр. 2015 г.
Задавать значения типа char можно при помощи следующих литералов или управляющих символов, например:
Символьные литералы
‘A’ – символьный литерал, заданный напрямую любым отображаемым символом Unicode
‘\uxxxx’ – символ Unicode, где xxxx цифровой код символа Unicode в шестнадцатеричной форме
‘\xxx’ – символ кодовой таблицы Latin-1, где xxx восьмеричный код символа Latin-1
1046 – код символа Unicode в десятичном исчислении
0x0950 – код символа Unicode в шестнадцатеричном формате
Поскольку char – это целочисленный тип, то ему можно присваивать значения всеми теми же литералами, что и другим целочисленным, это могут быть и двоичные и восьмеричные литералы, только в этом нет ни какого смысла и это даже не удобно.
Управляющие символы (так же должны быть заключены в одинарные кавычки):
\b – backspase BS – забой (\u0008 в кодировке Unicode и 8 в десятичной)
\t – horizontal tab HT – табуляция (\u0009 в кодировке Unicode и 9 в десятичной)
\n – line feed LF – конец строки (\u000a в кодировке Unicode и 10 в десятичной)
\f – form feed FF – конец страницы (\u000с в кодировке Unicode и 12 в десятичной)
\r – carriage return CR – возврат каретки (\u000d в кодировке Unicode и 13 в десятичной)
\” – двойная кавычка (\u0022 в кодировке Unicode и 34 в десятичной)
\’ – одинарная кавычка (\u0027 в кодировке Unicode и 39 в десятичной)
\\ – backslash \ – обратная косая черта (\u005c в кодировке Unicode и 92 в десятичной)
Для справки про запись символов в восьмеричной системе счисления: код любого символа с десятичной кодировкой от 0 до 255 можно задать, записав его не более чем тремя цифрами в восьмеричной системе счисления в апострофах после обратной наклонной черты: ‘ \123’ — буква S, ‘ \346’ — буква Ж в кодировке CP1251. Особого смысла нет использовать эту форму записи для печатных и управляющих символов, перечисленных в предыдущем пункте, поскольку компилятор сразу же переведет восьмеричную запись в шестнадцатеричную. Наибольший восьмеричный код
‘ \377’ — десятичное число 255.
ПРИМЕЧАНИЕ
Прописные русские буквы в кодировке Unicode занимают диапазон от ‘\u0410’ — заглавная буква А, до ‘\u042F’ — заглавная Я, строчные буквы от ‘\u0430’ — а, до ‘\u044F’ — я.
Заглавная Ё – ‘\u0401’, и строчная ё – ‘\u0451’.
Ну а теперь немножко попрактикуемся, чтобы не было скучно, и продолжим, так как это еще не все с типом char.
Как видно из скрина программы, значения переменным типа char можно задавать разными способами, как через десятичный код символа, так и через шестнадцатеричный, а для управляющих символов доступны кроме кодов еще и сами управляющие символы.
Ради прикола я создал переменную с идентификатором ё, который вполне допустив в Java, так как Java использует символы Unicode даже для записи кода самой программы.
Вывод программы в консоли Eclipse такой:
Как видим отработали наши символы табуляции, которые мы использовали, а так же оператор print(), который печатает без перевода на новую строку. Кроме того фразу Hello World мы заключили в двойные кавычки и немного ее разбили символом перевода строки и двумя символами табуляции.
Затем, в строке 22, мы увеличили значение переменной ё на единицу и снова вывели результат.
Таким образом видно, что примитивный тип char это целочисленный тип, над которым возможны все те же самые операции, что и над другими целочисленными типами.
В Eclipse эта программа запускается нормально, а вот в консоли это уже совсем другой кордебалет.
Прежде чем запускать эту программу, во первых надо задать для консоли кодировку UTF8, а затем запускать саму программу следующей командой:
Это необходимо делать, так как при выводе на консоль виртуальная машина java делает обратное преобразование из кодировки UTF8 в кодировку операционной системы, для Windows это 1251 или 866 в консоли.
CharType – это не параметр, это программа так называется, вернее класс.
Надо отметить, что если у вас нет каких-то специальных символов и вы просто используете русский язык под Windows, то все эти танцы с бубнами не нужны. Они так же не нужны если вы пишете под Mac OS X на Java, поскольку консоль там нативно поддерживает Unicode.
Стоит так же упомянуть, что на нынешний момент количество символов Unicode уже превышает 65536, поэтому с Java 5 для работы с этими символами было введено понятие суррогатной пары, поскольку 16 разрядного типа char уже стало не хватать. Для работы с этими символами используется две переменные типа char. Первый символ в паре обозначающих один символ Unicode называется high surrogate, а второй – low surrogate, а вместе они называются суррогатной парой и их обоих так же можно хранить в переменной типа int.
На практике, использование суррогатной пары, встречается чрезвычайно редко, но знать об этом следует. Более подробно об Unicode в Java и кодовых точках можно почитать тут и тут. И еще тут.
Приведу простой пример по работе с суррогатной парой в Java, чтобы было хоть какое-то представление. В примере, естественно, есть вещи которые еще мы не проходили, такие как циклы, массивы, условные проверки и т.п., но надеюсь что все будет понятно.
Данная программа проверяет является ли суррогатная пара допустимым значением и если да, то выводит этот символ на экран, а так же выводит код кодовой точки.
В данном случае выводится символ ракеты представленной кодом UTF-16BE 0xD83D и 0xDE80, что соответствует кодовой точке 128640.
Как видно в примере переменным типа char значения заданы при помощи шестнадцатеричных цифровых литералов.
Так же следует обратить внимание на то что я подсветил желтым
Ну а теперь посмотрим на вывод этой программы в консоли Eclipse
И в консоли Windows
На этом с char пока все. И еще пара ссылок по теме Unicode тут и тут.
ez code
Управление строками, функции для работы со строками в Java.
В этом уроке мы продолжим изучение строк в Java. Основы работы со строками можно посмотреть в уроке «Строки в Java».
Класс String в Java имеет набор методов для управление содержимым строки. Находить символы, подстроки, изменять регистр и другие задачи.
Получение символов и подстрок
Вы можете получить символ, находящийся на определенной позиции в строке, вызвав метод charAt(). Индекс первого символа в строке — 0, последнего — length()-1. Следующий код возвращает 9 символ строки.
Нумерация символов начинается с 0, поэтому 9 символ в строке — «О».
Нумерация символов в строке
Если вам необходимо получить не один символ, а часть строки, можно использовать метод substring. Метод substring имеет два варианта:
Метод | Описание |
---|---|
String substring(int beginIndex, int endIndex) | Возвращает подстроку данной строки, начиная с символа с индексом beginIndex, заканчивая endIndex — 1. |
String substring(int beginIndex) | Возвращает подстроку данной строки, начиная с символа под номером beginIndex и до конца строки. |
Следующий код вернет подстроку строки, начиная с 11 символа, но не включая 15, получится слово «roar»
Другие методы для управления строками
В таблице приведены некоторые методы для работы со строками и их описание.
Метод | Описание |
---|---|
String[] split(String regex) String[] split(String regex, int limit) | Ищет совпадения в строке согласно заданному регулярному выражению и разбивает строку на массив. Необязательный аргумент limit задает максимальный размер возвращаемого массива. |
CharSequence subSequence(int beginIndex, int endIndex) | Возвращает последовательность символов, начиная с beginIndex, заканчивая endIndex — 1. |
String trim() | Возвращает строку, в которой удалены лишние пробелы в начале строки и в конце. |
String toLowerCase() String toUpperCase() | Возвращает копию строки, символы которой переведены в нижний или верхний регистр. Если преобразований не требуется возвращается оригинальная строка. |
Поиск символов и подстрок
В следующей таблице описываются методы indexOf()и lastIndexOf().
Метод | Описание |
---|---|
int indexOf(int ch) int lastIndexOf(int ch) | Возвращает индекс первого(последнего) вхождения символа в строке. |
int indexOf(int ch, int fromIndex) int lastIndexOf(int ch, int fromIndex) | Возвращает индекс первого(последнего) вхождения символа в строке, начиная поиск с указанного индекса. |
int indexOf(String str) int lastIndexOf(String str) | Возвращает индекс первого(последнего) вхождения подстроки в строке. |
int indexOf(String str, int fromIndex) int lastIndexOf(String str, int fromIndex) | Возвращает индекс первого(последнего) вхождения подстроки в строке, начиная поиск с указанного индекса. |
boolean contains(CharSequence s) | Возвращает true, если заданная последовательность символов содержится в строке. |
CharSequence — это интерфейс, который реализует класс String, поэтому вы можете передавать строки в метод contains().
Изменение строк. Замена символов и подстрок
Класс String имеет несколько методов для вставки символов и подстрок в строку. В таблице описаны методы для замены найденных символов и подстрок.
Метод | Описание |
---|---|
String replace(char oldChar, char newChar) | Возвращает новую строку, в которой все oldChar заменены на newChar. |
String replace(CharSequence target, CharSequence replacement) | Заменяет все вхождения подстроки target на строку replacement. |
String replaceAll(String regex, String replacement) | Заменяет все подстроки, которые описывает заданное регулярное выражение на replacement |
String replaceFirst(String regex, String replacement) | Заменяет только первую подходящую подстроку. |
Пример
Теперь рассмотрим программу, которая использует класс Filename:
Метод extension использует метод lastIndexOf для определения последнего вхождения «.». Метод substring использует это значение для нахождения расширения файла.
Руководство по кодировке символов
Изучите кодировку символов в Java и узнайте о распространенных подводных камнях.
1. Обзор
В этом уроке мы обсудим основы кодирования символов и то, как мы справляемся с этим в Java.
2. Важность кодирования символов
Нам часто приходится иметь дело с текстами, принадлежащими к нескольким языкам с различными письменными знаками, такими как латинский или арабский. Каждый символ в каждом языке должен быть каким-то образом сопоставлен с набором единиц и нулей. Действительно, удивительно, что компьютеры могут правильно обрабатывать все наши языки.
Чтобы сделать это правильно, нам нужно подумать о кодировке символов. Невыполнение этого требования часто может привести к потере данных и даже уязвимостям безопасности.
Чтобы лучше понять это, давайте определим метод декодирования текста на Java:
Обратите внимание, что вводимый здесь текст использует кодировку платформы по умолчанию.
Ну, не совсем то, что мы ожидали.
Что могло пойти не так? Мы постараемся понять и исправить это в оставшейся части этого урока.
3. Основы
3.1. Кодирование
Например, первая буква в нашем сообщении, “T”, в US-ASCII кодирует в “01010100”.
3.2. Кодировки
3.3. Кодовый пункт
Кодовая точка-это абстракция, которая отделяет символ от его фактической кодировки. A кодовая точка – это целочисленная ссылка на определенный символ.
Мы можем представить само целое число в простых десятичных или альтернативных основаниях, таких как шестнадцатеричное или восьмеричное. Мы используем альтернативные базы для удобства ссылки на большие числа.
Например, первая буква в нашем сообщении, T, в Юникоде имеет кодовую точку “U+0054” (или 84 в десятичной системе счисления).
4. Понимание Схем Кодирования
Кодировка символов может принимать различные формы в зависимости от количества символов, которые она кодирует.
Количество закодированных символов имеет прямое отношение к длине каждого представления, которое обычно измеряется как количество байтов. Наличие большего количества символов для кодирования по существу означает необходимость более длинных двоичных представлений.
Давайте рассмотрим некоторые из популярных схем кодирования на практике сегодня.
4.1. Однобайтовое кодирование
Одна из самых ранних схем кодирования, называемая ASCII (Американский стандартный код для обмена информацией), использует однобайтовую схему кодирования. По сути, это означает, что каждый символ в ASCII представлен семибитными двоичными числами. Это все еще оставляет один бит свободным в каждом байте!
Ascii 128-символьный набор охватывает английские алфавиты в нижнем и верхнем регистрах, цифры и некоторые специальные и контрольные символы.
Давайте определим простой метод в Java для отображения двоичного представления символа в определенной схеме кодирования:
Теперь символ ” T ” имеет кодовую точку 84 в US-ASCII (ASCII в Java называется US-ASCII).
И если мы используем наш метод утилиты, мы можем увидеть его двоичное представление:
Это, как мы и ожидали, семиразрядное двоичное представление символа “T”.
Исходный ASCII оставил самый значимый бит каждого байта неиспользованным. В то же время ASCII оставил довольно много непредставленных символов,
Исходный ASCII оставил самый значимый бит каждого байта неиспользованным. || В то же время ASCII оставил довольно много непредставленных символов,
Было предложено и принято несколько вариантов схемы кодирования ASCII.
Многие расширения ASCII имели разные уровни успеха, но, очевидно, это
4.2. Многобайтовое кодирование
Поскольку потребность в размещении все большего количества символов росла, однобайтовые схемы кодирования, такие как ASCII, не были устойчивыми.
Это привело к появлению многобайтовых схем кодирования, которые имеют гораздо большую емкость, хотя и за счет увеличения требований к пространству.
Давайте теперь вызовем метод convertToBinary с вводом как “語”, китайский символ, и кодирование как “Big5”:
Вывод выше показывает, что кодировка Big5 использует два байта для представления символа “語”.
полный список кодировок символов, наряду с их псевдонимами, ведется Международным органом по номерам.
5. Юникод
Нетрудно понять, что, хотя кодирование важно, декодирование в равной степени жизненно важно для понимания представлений. Это возможно на практике только в том случае, если широко используется согласованная или совместимая схема кодирования.
Различные схемы кодирования, разработанные изолированно и практикуемые в местных географических регионах, начали становиться сложными.
Ну, для этого должно потребоваться несколько байтов для хранения каждого символа? Честно говоря, да, но у Unicode есть гениальное решение.
Unicode как стандарт определяет кодовые точки для каждого возможного символа в мире. Кодовая точка для символа “T” в Юникоде равна 84 в десятичной системе счисления. Обычно мы называем это “U+0054” в Юникоде, который представляет собой не что иное, как U+, за которым следует шестнадцатеричное число.
Мы используем шестнадцатеричную систему в качестве основы для кодовых точек в Юникоде, поскольку существует 1 114 112 точек, что является довольно большим числом для удобной передачи в десятичном формате!
То, как эти кодовые точки кодируются в биты, зависит от конкретных схем кодирования в Юникоде. Мы рассмотрим некоторые из этих схем кодирования в подразделах ниже.
5.1. UTF-32
Вывод выше показывает использование четырех байтов для представления символа “T”, где первые три байта-это просто потраченное впустую пространство.
5.2. UTF-8
Давайте снова вызовем метод convertToBinary с вводом как “T” и кодированием как ” UTF-8″:
Вывод в точности аналогичен ASCII, использующему только один байт. На самом деле UTF-8 полностью обратно совместим с ASCII.
Давайте снова вызовем метод convertToBinary с вводом как “語” и кодированием как ” UTF-8″:
Как мы видим здесь, UTF-8 использует три байта для представления символа “語”. Это известно как кодирование переменной ширины .
UTF-8, благодаря своей экономичности пространства, является наиболее распространенной кодировкой, используемой в Интернете.
6. Поддержка кодирования в Java
Есть некоторые тонкости в том, как Java подбирает кодировку для работы. Давайте рассмотрим их более подробно.
6.1. Кодировка по умолчанию
Это зависит от локали и кодировки базовой операционной системы, на которой работает JVM. Например, в macOS кодировка по умолчанию-UTF-8.
Давайте посмотрим, как мы можем определить кодировку по умолчанию:
Если мы запустим этот фрагмент кода на компьютере с Windows, то получим результат:
Теперь “windows-1252” – это кодировка по умолчанию платформы Windows на английском языке, которая в данном случае определила кодировку по умолчанию JVM, работающей в Windows.
6.2. Кто использует Кодировку по умолчанию?
Многие API Java используют кодировку по умолчанию, определенную JVM. Чтобы назвать несколько:
Итак, это означает, что если бы мы запустили наш пример без указания кодировки:
затем он будет использовать кодировку по умолчанию для ее декодирования.
И есть несколько API, которые делают этот же выбор по умолчанию.
Таким образом, кодировка по умолчанию приобретает важность, которую мы не можем безопасно игнорировать.
6.3. Проблемы С Набором Символов По Умолчанию
Как мы уже видели, кодировка по умолчанию в Java определяется динамически при запуске JVM. Это делает платформу менее надежной или подверженной ошибкам при использовании в разных операционных системах.
Например, если мы запустим
в macOS он будет использовать UTF-8.
Если мы попробуем тот же фрагмент кода в Windows, он будет использовать Windows-1252 для декодирования того же текста.
Или представьте, что вы пишете файл в mac OS, а затем читаете тот же файл в Windows.
Нетрудно понять, что из-за различных схем кодирования это может привести к потере или повреждению данных.
6.4. Можем ли мы переопределить кодировку по умолчанию?
Определение кодировки по умолчанию в Java приводит к двум системным свойствам:
Теперь интуитивно понятно переопределять эти системные свойства с помощью аргументов командной строки:
6.5. Почему Java Не Решает Эту Проблему?
Существует предложение по улучшению Java (JEP), которое предписывает использовать “UTF-8” в качестве кодировки по умолчанию в Java вместо того, чтобы основывать ее на кодировке локали и операционной системы.
Этот ДЖИП находится в состоянии проекта на данный момент и когда он (надеюсь!) пройдя через него, мы решим большинство вопросов, которые мы обсуждали ранее.
Обратите внимание, что более новые API, такие как в файле java.nio.file.Файлы не используют кодировку по умолчанию. Методы в этих API-интерфейсах читают или записывают символьные потоки с кодировкой UTF-8, а не с кодировкой по умолчанию.
6.6. Решение Этой Проблемы в Наших Программах
К счастью, наш пример уже определяет кодировку. Нам просто нужно выбрать правильный, и пусть Java сделает все остальное.
К настоящему времени мы должны понять, что акцентированные символы, такие как “ç”, отсутствуют в схеме кодирования ASCII, и поэтому нам нужна кодировка, которая включает их. Может быть, UTF-8?
Давайте попробуем это сделать, теперь мы запустим метод decode Text с тем же вводом, но с кодировкой “UTF-8”:
Бинго! Мы можем увидеть результат, который мы надеялись увидеть.
Аналогично, OutputStreamWriter и многие другие API поддерживают настройку схемы кодирования через свой конструктор.
6.7. Исключение MalformedInputException
Существует три предопределенные стратегии (или CodingErrorAction ), когда входная последовательность имеет искаженные входные данные:
По умолчанию malformedInputAction для кодера CharsetDecoder является REPORT, и по умолчанию malformedInputAction декодера по умолчанию в InputStreamReader is REPLACE.
Для третьего теста мы используем CodingErrorAction.ОТЧЕТ который приводит к выбрасыванию MalformedInputException:
7. Другие Места, Где Кодирование Важно
Нам не просто нужно учитывать кодировку символов при программировании. Тексты могут окончательно испортиться во многих других местах.
Давайте быстро рассмотрим несколько мест, где мы можем столкнуться с проблемами при кодировании или декодировании текста.
7.1. Текстовые Редакторы
В большинстве случаев текстовый редактор-это место, откуда исходят тексты. Существует множество текстовых редакторов в популярном выборе, включая vi, Блокнот и MS Word. Большинство из этих текстовых редакторов позволяют нам выбрать схему кодирования. Следовательно, мы всегда должны быть уверены, что они подходят для текста, с которым мы работаем.
7.2. Файловая система
После того, как мы создадим тексты в редакторе, нам нужно сохранить их в какой-то файловой системе. Файловая система зависит от операционной системы, на которой она работает. Большинство операционных систем имеют встроенную поддержку нескольких схем кодирования. Однако все еще могут быть случаи, когда преобразование кодировки приводит к потере данных.
7.3. Сеть
Тексты, передаваемые по сети с использованием протокола, такого как протокол передачи файлов (FTP), также включают преобразование между кодировками символов. Для всего, что закодировано в Юникоде, безопаснее всего передавать в двоичном виде, чтобы свести к минимуму риск потери при преобразовании. Однако передача текста по сети является одной из менее частых причин повреждения данных.
7.4. Базы данных
Большинство популярных баз данных, таких как Oracle и MySQL, поддерживают выбор схемы кодирования символов при установке или создании баз данных. Мы должны выбрать это в соответствии с текстами, которые мы ожидаем сохранить в базе данных. Это одно из наиболее частых мест, где повреждение текстовых данных происходит из-за преобразования кодировки.
7.5. Браузеры
Наконец, в большинстве веб-приложений мы создаем тексты и пропускаем их через различные слои с намерением просмотреть их в пользовательском интерфейсе, например в браузере. Здесь также важно, чтобы мы выбрали правильную кодировку символов, которая может правильно отображать символы. Большинство популярных браузеров, таких как Chrome, Edge, позволяют выбирать кодировку символов в своих настройках.
8. Заключение
В этой статье мы обсудили, как кодирование может быть проблемой при программировании.
Далее мы обсудили основные принципы, включая кодировку и кодировки. Более того, мы прошли через различные схемы кодирования и их использование.
Мы также подобрали пример неправильного использования кодировки символов в Java и увидели, как это сделать правильно. Наконец, мы обсудили некоторые другие распространенные сценарии ошибок, связанные с кодировкой символов.