2009-09-23 2 views
3

Есть ли способ преобразования строки ANSI в UTF с использованием Java.Преобразование символов ANSI в UTF-8 в Java

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

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

Однако в моих тестов JUnit я в состоянии создать строку с 120000 «а и это отлично работает

Я проверил следующие сообщения, но все еще имею ошибки;

+0

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

+3

Нет ANSI! = ASCII. ANSI - это целая коллекция кодовых страниц. –

+0

из-за ограничений по размеру для readUTF и writeUTF. Я изменил свой сериализатор. Отправьте текст по частям. – n002213f

ответ

6

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

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

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

Этот предел зашиты и нет способа обойти это,

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

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

+0

Вы должны показать мне свои тестовые примеры. Они не правы. Смотрите мои правки. –

+0

Я использовал следующий код для генерации тестовой строки; StringBuffer sb2 = new StringBuffer(); \t \t для (int i = 0; i <120000; i ++) { \t \t \t sb2.append ("a"); \t \t} \t \t Строка longString2 = sb2.toString(); – n002213f

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

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

2

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

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

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

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

+0

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

+0

это преобразует ANSI из telnet, подобно игре с грязью, в «обычную» строку? – Thufir

+0

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^