Вы не уточнили, какие данные вы отправляете и читаете. Вы отправляете двоичные байты или символы Unicode? Метод reader .read () возвращает int. Да, но он возвращает прочитанный символ как целое число в диапазоне от 0 до 65535 (или -1, потому что я думаю, что вместо char используется int). Может, простое использование public int read(char[] cbuf)решит проблему?
Я думаю, это правильный вопрос. Одна из трудностей преобразования целого числа в символ
связана
Что, если я хочу преобразовать байт, который находится в массиве байтов, в символ, а затем распечатать его на консоли?
Дуг Хауф
Ответы:
74
Если вы пытаетесь преобразовать поток в текст, вам нужно знать, какую кодировку вы хотите использовать. Затем вы можете либо передать массив байтов в Stringконструктор и предоставить Charset, либо использовать вместо него InputStreamReaderсоответствующий Charset.
Простое преобразование из intв charработает только в том случае, если вам нужен ISO-8859-1, если вы читаете байты напрямую из потока.
EDIT: Если вы которые уже используете Reader, а затем литье возвращаемого значения read()для charправильного путь (после проверки , является ли это -1 или нет) ... но это обычно более эффективных и удобные для вызова read(char[], int, int)читать весь блок текст за раз. Не забудьте проверить возвращаемое значение, чтобы узнать, сколько символов было прочитано.
Если он действительно использует Reader, это, безусловно, имеет значение. Это непонятно, учитывая, что он говорит о потоке и читателе (со строчной буквой r) в одном предложении :( Отредактировал свой ответ, чтобы прояснить это.
Почему «Простое преобразование из int в char работает только в том случае, если вам нужен ISO-8859-1»? Это потому, что Java внутренне использует UTF-16, и все символы ISO-8859-1 сохраняют одну и ту же кодовую единицу (биты) в UTF-16?
Преобразует указанный символ (кодовая точка Unicode) в его представление UTF-16, хранящееся в массиве символов. Если указанная кодовая точка является значением BMP (Basic Multilingual Plane или Plane 0), результирующий массив символов имеет то же значение, что и codePoint. Если указанная кодовая точка является дополнительной кодовой точкой, результирующий массив символов имеет соответствующую суррогатную пару.
Это действительно только в том случае, если рассматриваемое целое число уже является кодовой точкой UTF-16. Мы понятия не имеем, так ли это.
Джон Скит,
2
@Atec: Нет, я хочу сказать, что если он просто читает байты из потока (это не ясно), то преобразование путем простого преобразования или использования toCharsобычно неуместно. Если он читает из Reader, тогда все в порядке.
Джон Скит,
2
Хотя, по общему признанию, вопрос не указывал на это, этот вопрос возникает как первый результат поиска Google по преобразованию кодовых точек ASCII в символы, поэтому я поддерживаю его.
ArtOfWarfare
105
Это зависит от того, что вы подразумеваете под «преобразованием int в char».
Если вы просто хотите преобразовать значение в int, вы можете преобразовать его, используя нотацию приведения типов Java:
int i =97;// 97 is 'a' in ASCIIchar c =(char) i;// c is now 'a'
Если вы имеете в виду преобразование целого числа 1 в символ «1», вы можете сделать это следующим образом:
if(i >=0&& i <=9){char c =Character.forDigit(i,10);....}
Опасный совет, если текстовый поток не является чистым ASCII. См. Ответ Джона Скита выше.
sleske
1
Это может не сработать. Но я думаю, что это действительно так. Тип данных char хранит значение в кодировке UTF-16. Итак, чтобы преобразовать char в int, вам нужно сделать некоторые преобразования. Но поскольку OP использует метод read (), который уже возвращает значение в кодировке UTF-16, я думаю, что простое приведение будет работать. Поправьте меня, если я ошибаюсь.
Вануан,
Извините, я имел в виду «от int к char»
Вануан
это вызовет неожиданные значения кодировки, а не числа
Васил Валчев
4
Это решение работает для целочисленной длины size = 1.
Большинство ответов здесь предлагают ярлыки, которые могут вызвать у вас большие проблемы, если вы не знаете, что делаете. Если вы хотите использовать ярлыки, вы должны точно знать, в какой кодировке находятся ваши данные.
UTF-16
Всякий раз, когда java говорит о символах в своей документации, она говорит о 16-битных символах.
Вы можете использовать a DataInputStream, у которого есть удобные методы. Для эффективности заверните его в файл BufferedReader.
// e.g. for socketsDataInputStream in =newDataInputStream(newBufferedInputStream(socket.getInputStream()));char character = readChar();// no need to cast
Дело в том, что каждый readChar()фактически выполняет 2 readи объединяет их в один 16-битный символ.
US-ASCII
US-ASCII резервирует 8 бит для кодирования 1 символа. Таблица ASCII описывает только 128 возможных символов, поэтому 1 бит всегда не используется.
В этом случае вы можете просто выполнить гипс.
int input = stream.read();if(input <0)thrownewEOFException();char character =(char) input;
Расширенный ASCII
UTF-8, Latin-1, ANSI и многие другие кодировки используют все 8-битные. Первые 7 бит следуют за таблицей ASCII и идентичны кодировке US-ASCII. Однако 8-й бит предлагает символы, которые во всех этих кодировках различаются. Итак, здесь все становится интересно.
Если вы ковбой и думаете, что 8-й бит не имеет значения (т. Е. Вас не волнуют такие символы, как «à, é, ç, è, ô ...), то вы можете обойтись простым приведением.
Однако, если вы хотите делать это профессионально, вы действительно должны ВСЕГДА указывать кодировку всякий раз, когда вы импортируете / экспортируете текст (например, сокеты, файлы ...).
Всегда используйте кодировки
Давайте серьезно. Все вышеперечисленные варианты - дешевые уловки. Если вы хотите написать гибкое программное обеспечение, вам необходимо поддерживать настраиваемую кодировку для импорта / экспорта ваших данных. Вот общее решение:
Прочтите ваши данные, используя byte[]буфер, и конвертируйте их в, Stringиспользуя параметр charset .
byte[] buffer =newbyte[1024];int nrOfBytes = stream.read(buffer);String result =newString(buffer, nrOfBytes, charset);
Вы также можете использовать, InputStreamReaderкоторый может быть создан с параметром charset.
Еще одно золотое правило: никогда не приводите байты к символу напрямую. Это всегда ошибка.
public int read(char[] cbuf)
решит проблему?Ответы:
Если вы пытаетесь преобразовать поток в текст, вам нужно знать, какую кодировку вы хотите использовать. Затем вы можете либо передать массив байтов в
String
конструктор и предоставитьCharset
, либо использовать вместо негоInputStreamReader
соответствующийCharset
.Простое преобразование из
int
вchar
работает только в том случае, если вам нужен ISO-8859-1, если вы читаете байты напрямую из потока.EDIT: Если вы которые уже используете
Reader
, а затем литье возвращаемого значенияread()
дляchar
правильного путь (после проверки , является ли это -1 или нет) ... но это обычно более эффективных и удобные для вызоваread(char[], int, int)
читать весь блок текст за раз. Не забудьте проверить возвращаемое значение, чтобы узнать, сколько символов было прочитано.источник
InputStreamReader
в aBufferedReader
, как указано в javadoc docs.oracle.com/javase/8/docs/api/java/io/…Может быть, вы просите:
Больше информации:
Character.toChars(int codePoint)
источник
toChars
обычно неуместно. Если он читает из Reader, тогда все в порядке.Это зависит от того, что вы подразумеваете под «преобразованием int в char».
Если вы просто хотите преобразовать значение в int, вы можете преобразовать его, используя нотацию приведения типов Java:
Если вы имеете в виду преобразование целого числа 1 в символ «1», вы можете сделать это следующим образом:
источник
Если вы хотите просто преобразовать int 5 в char '5': (Только для целых чисел 0-9)
источник
Простое литье:
Есть ли причина, по которой это не работает для вас?
источник
Это решение работает для целочисленной длины size = 1.
Integer input = 9; Character.valueOf((char) input.toString().charAt(0))
если size> 1, нам нужно использовать цикл for и выполнить итерацию.
источник
Большинство ответов здесь предлагают ярлыки, которые могут вызвать у вас большие проблемы, если вы не знаете, что делаете. Если вы хотите использовать ярлыки, вы должны точно знать, в какой кодировке находятся ваши данные.
UTF-16
Всякий раз, когда java говорит о символах в своей документации, она говорит о 16-битных символах.
Вы можете использовать a
DataInputStream
, у которого есть удобные методы. Для эффективности заверните его в файлBufferedReader
.Дело в том, что каждый
readChar()
фактически выполняет 2read
и объединяет их в один 16-битный символ.US-ASCII
US-ASCII резервирует 8 бит для кодирования 1 символа. Таблица ASCII описывает только 128 возможных символов, поэтому 1 бит всегда не используется.
В этом случае вы можете просто выполнить гипс.
Расширенный ASCII
UTF-8, Latin-1, ANSI и многие другие кодировки используют все 8-битные. Первые 7 бит следуют за таблицей ASCII и идентичны кодировке US-ASCII. Однако 8-й бит предлагает символы, которые во всех этих кодировках различаются. Итак, здесь все становится интересно.
Если вы ковбой и думаете, что 8-й бит не имеет значения (т. Е. Вас не волнуют такие символы, как «à, é, ç, è, ô ...), то вы можете обойтись простым приведением.
Однако, если вы хотите делать это профессионально, вы действительно должны ВСЕГДА указывать кодировку всякий раз, когда вы импортируете / экспортируете текст (например, сокеты, файлы ...).
Всегда используйте кодировки
Давайте серьезно. Все вышеперечисленные варианты - дешевые уловки. Если вы хотите написать гибкое программное обеспечение, вам необходимо поддерживать настраиваемую кодировку для импорта / экспорта ваших данных. Вот общее решение:
Прочтите ваши данные, используя
byte[]
буфер, и конвертируйте их в,String
используя параметр charset .Вы также можете использовать,
InputStreamReader
который может быть создан с параметром charset.Еще одно золотое правило: никогда не приводите байты к символу напрямую. Это всегда ошибка.
источник
На основании моего ответа на предположении , что пользователь просто хотел literaaly преобразовать
int
вchar
, например ,На это уже был дан ответ выше, однако, если целочисленное значение
i > 10
, то нужно использоватьchar array
.источник
источник
Это полностью зависит от кодировки входящих данных.
источник
возможно, не самый быстрый:
источник
Ответ на преобразование char в int или long - простое приведение.
Например: - если вы хотите преобразовать Char '0' в long.
Следуйте простому составу
Готово!!
источник