Java ansi to utf8

Преобразование символов ANSI в UTF-8 в Java

Есть ли способ преобразовать строку ANSI в UTF с помощью Java. У меня есть собственный сериализатор, который использует методы readUTF и writeUTF класса DataInputStream для десериализации и сериализации строки. Если я получаю строку, закодированную в ANSI, и она слишком длинная, ~ 100000 символов, я получаю сообщение об ошибке;

Вызвано: java.io.UTFDataFormatException: слишком длинная закодированная строка: 106958 байт

Вы имеете в виду ASCII? Если это так, он уже есть в UTF-8 — не могли бы вы объяснить немного больше. Показать ошибки и т. Д. — mmmmmm

Нет ANSI! = ASCII. ANSI — это целый набор кодовых страниц. — Aaron Digulla

из-за ограничений размера для readUTF и writeUTF я изменил свой сериализатор для отправки текста по частям — n002213f

4 ответы

Эта ошибка не вызвана кодировкой символов. Это означает, что длина данных UTF неверна.

РЕДАКТИРОВАТЬ: только что понял, что это ошибка записи, а не ошибка чтения.

Длина UTF составляет всего 2 байта, поэтому он может содержать только 64 КБ UTF-8. Вы пытаетесь написать 100К, это не сработает.

Это ограничение жестко запрограммировано, и его невозможно обойти,

if (utflen > 65535) throw new UTFDataFormatException( "encoded string too long: " + utflen + " bytes"); 

Интересно, а почему все мои тесты с большим количеством персонажей проходят? — n002213f

Вы должны показать мне свои тестовые случаи. Они ошибаются. Смотрите мои правки. — ZZ Кодер

Я использовал следующий код для создания тестовой строки; StringBuffer sb2 = новый StringBuffer (); для (int я = 0; я Строка longString2 = sb2.toString (); — n002213f

Вы можете создавать длинные строки, пока не закончится память. Вы просто не можете писать длинные строки с помощью writeUTF (). Напишите его по-своему с заголовком длиной 4 байта. — ZZ Кодер

byte[] asciiBytes = . ; String unicode = new String(asciiBytes, "US-ASCII"); byte[] utfBytes = unicode.getBytes("UTF-8"); 

Кажется, я неправильно истолковал исходный вопрос относительно ASCII и ANSI, и с учетом последних редакций вопроса мой ответ не совсем актуален. — Iammichael

Который Кодовая страница ANSI? Существует множество различных кодировок символов, которые относятся к «ANSI». Кодовая страница DOS — 437 (без графических символов). Если вы используете кодовую страницу 850, это будет работать:

String unicode = new String(bytes, "IBM850"); 

(где bytes представляет собой массив с символами ANSI). После этого вы можете преобразовать эту строку в массив байтов с любой кодировкой, используя unicode.getBytes(encoding) .

Читайте также:  Показать все файлы php

Windows часто использует кодовую страницу 1252 (для этого используйте «windows-1252»).

попробовал, но не работает, я получаю ту же ошибку. Есть ли способ проверить кодировку в строке, чтобы я мог быть уверен, что это ANSI? — n002213f

это преобразует ANSI из telnet, как грязную игру, в «обычную» строку? — Туфир

Это преобразует байты из любого источника в строку Unicode. Но для правильной работы вам необходимо точно знать, какую кодировку использует источник. Неважно, файл это, удаленная служба или аппаратное устройство. — Аарон Дигулла

ZZ Coder уже ответил на вопрос, но я написал более подробное объяснение и предлагаю обходной путь этот блог. По сути, проблема в DataOutputStream, потому что он ограничивает доступную для записи String размером 64 КБ. Есть и другие возможные обходные пути, чтобы обойти проблему, некоторые из них могут работать без нарушения фактического формата двоичных данных, который используется .

Источник

Конвертировать символы ANSI в UTF-8 в Java

Есть ли способ преобразовать строку ANSI в UTF с помощью Java. У меня есть собственный сериализатор, который использует методы readUTF и writeUTF класса DataInputStream для десериализации и последовательной строки. Если я получаю строку, закодированную в ANSI и слишком длинную, ~ 100000 символов длиной я получаю ошибку;

Вызвано: java.io.UTFDataFormatException: закодированная строка слишком длинная: 106958 байт

Вы имеете в виду ASCII? Если так, то это уже в UTF-8 — не могли бы вы объяснить немного больше? Показать ошибки и т. Д.

Из-за ограничений по размеру readUTF и writeUTF я изменил мой сериализатор отправлять текст по частям

4 ответа

Эта ошибка не вызвана кодировкой символов. Это означает, что длина данных UTF неверна.

EDIT: Просто понял, что это ошибка записи, а не ошибка чтения.

Длина UTF составляет всего 2 байта, поэтому она может содержать только 64 Кбайт UTF-8 байтов. Вы пытаетесь написать 100K, это не сработает.

Этот предел жестко запрограммирован и не имеет возможности обойти это,

if (utflen > 65535) throw new UTFDataFormatException( "encoded string too long: " + utflen + " bytes"); 

я использовал следующий код для генерации тестовой строки; StringBuffer sb2 = new StringBuffer (); for (int i = 0; i <120000; i ++) String longString2 = sb2.toString ();

Читайте также:  Css object fit contain

Вы можете создавать длинные строки, пока не освободится память. Вы просто не можете писать длинные строки, используя writeUTF (). Напишите это по-своему с заголовком длиной 4 байта.

byte[] asciiBytes = . ; String unicode = new String(asciiBytes, "US-ASCII"); byte[] utfBytes = unicode.getBytes("UTF-8"); 

Кажется, я неправильно понял исходный вопрос, касающийся ASCII и ANSI, и с последними изменениями в вопросе мой ответ не очень актуален.

Какая ANSI кодовая страница? Существует множество различных кодировок символов, которые все относятся к «ANSI». Кодовая страница DOS составляет 437 (без символов рисования). Если вы используете кодовую страницу 850, это будет работать:

String unicode = new String(bytes, "IBM850"); 

(где bytes — массив с символами ANSI). После этого вы можете преобразовать эту строку в массив байтов с любой кодировкой, используя unicode.getBytes(encoding) .

Windows часто использует кодовую страницу 1252 (для этого используется «windows-1252» ).

попробовал, но не работает, я получаю ту же ошибку. Есть ли способ проверить кодировку в строке, чтобы я мог быть уверен, что его ANSI?

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

ZZ Coder уже ответил на вопрос, но я написал более подробное объяснение и предложил обходное решение в этом блоге. В основном проблема заключается в DataOutputStream, поскольку она ограничивает записываемую строку до 64 КБ. Есть и другие возможные способы обхода проблемы, некоторые из них могут работать, не нарушая фактический формат двоичных данных, который используется.

Ещё вопросы

  • 0 jQuery Click Event на мобильном телефоне
  • 0 использование curl с php не может соединиться
  • 1 Объяснение ссылки на массив
  • 1 Как сохранить цветовую шкалу d3 с разрывом и повторным соединением ссылок
  • 1 Flask bcrypt.check_password_hash () всегда возвращает False, не может сузить мою ошибку
  • 0 Как установить цвет фона в Geany для области видимости PHP, отличной от области видимости HTML?
  • 0 Есть ли функция SQLI, которая циклически перебирает массив, чтобы увидеть, есть ли какие-либо элементы в строке MYSQL?
  • 1 Не могу найти `fun Cursor.getString (columnName: String): реализация String`
  • 0 Angular JS получить вопрос о входном значении
  • 0 Выдача jquery show, hide, slidetoggle с cookie
  • 0 Как я могу переключить элемент с вектора на другой в C ++?
  • 0 jQuery: не (: проверено) не работает?
  • 1 Как исправить несколько методов одного и того же объекта
  • 1 просмотреть и скачать файл из sql db с помощью Entity FrameWork
  • 0 Окна Div сдвигаются, если я помещаю в них текст
  • 1 Получить изменение состояния Интернета, когда Wi-Fi подключен
  • 1 Сортировка многомерного массива в JavaScript?
  • 1 регулярное выражение слияния javascript
  • 1 Подсчет слов в столбце в фрейме данных
  • 1 Определить состояние сети и загрузить видео данные из фона, когда приложение убито в Android пирог (API 28)
  • 0 MySQLi_fetch_Array пропускает первый ряд
  • 1 Насколько эффективна эта хеш-функция?
  • 0 PHP: как вернуть счетчик значения из рекурсивной функции?
  • 0 Двоичное дерево не вставляется
  • 1 XamDataGrid — добавление столбцов во время выполнения
  • 1 Ошибка имени при запуске скрипта Python
  • 1 Как передать параметр в JavaScript найти функцию?
  • 0 рассчитать и вернуть количество дней в неделю
  • 0 Разбор XML-кода через PHP в jQuery — Ошибка XML
  • 1 получить цвет фона Cardview
  • 1 Android Studio — setBackground ()
  • 1 Как настроить ESLint, чтобы он запрещал экспорт по умолчанию
  • 1 Maven: неправильная версия Hibernate?
  • 0 Как потушить изображения и текст (здесь текст связан с конкретным изображением) за один раз, используя плагин цикла jQuery?
  • 1 Как получить идентификатор электронной почты в [email protected] вместо «CN = пример / OU = Сервер / O = компания» в заметках лотоса в Java
  • 0 окно постоянно получает WM_WINDOWPOSCHANGING
  • 1 Как навсегда разместить JFrame над другим?
  • 1 Проверяйте Html.DropDownListFor, а не отправляйте ошибочное значение, когда httpPost
  • 0 с ++: обмен картами
  • 1 Не удается сохранить нового пользователя с Express & Mongoose
  • 1 Regexp с .exec не работает
  • 0 Внутренняя ссылка без идентификатора в URL
  • 1 Боке: Не удается обновить формат всплывающей подсказки
  • 1 Свойство в объекте существует, но не определено
  • 1 Как создать несколько элементов в разных местах, используя методы DOM
  • 0 Проблема с запросом MySQL — сопоставление нескольких идентификаторов в объединенной таблице
  • 0 Php preg_replace () используя
  • 1 Как получить секунды с эпохи без связи со временем устройства? [Дубликат]
  • 1 Изменение состояния веб-приложения во время выполнения
  • 1 лямбда-выражения для сравнения, содержит ли строка [] заданную строку
Читайте также:  Enable javascript on my iphone

Источник

Оцените статью