Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> InputStream (определение кодировки) 
:(
    Опции темы
lat
  Дата 3.2.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Код

public void PrintStream(InputStream stream)
{
    int b;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();                
    while( (b = stream.read()) != -1 ) 
    {
       baos.write(b);
    }                
(1)    String buf = baos.toString();    
        ...
}


1. (stream instanceof FileInputStream) кодировка определяется нормально и в (1) данные записываются в нормальном виде.
2. (stream instanceof new StringBufferInputStream("ПРЕВЕД МЕДВЕД!");) в (1) получаем бред вместо ожидаемого.

Как сделать что б независимо от того кто есть "stream" (stream instanceof ?) кодировка определялась правильно?

Это сообщение отредактировал(а) lat - 3.2.2011, 14:09
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
lat
Дата 3.2.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Не могу понять в какой кодировке StringBufferInputStream пакует. Если брать данные из файла, то для русских букв идут отрицательные эквиваленты в таблице кодировок (в дебаге видно что все -).
StringBufferInputStream делает что то иное:
Код

System.out.println("char:" + (char)buf.getBytes()[0] + ", int:" + (int)buf.getBytes()[0]);


Print => "char:+, int:43"

Хотя должно было быть => "char:Ы, int:-ЧТО-ТО-ТАМ"


Это сообщение отредактировал(а) lat - 3.2.2011, 16:15
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Skipy
Дата 3.2.2011, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Автоматического определения кодировки тут нет. И быть не может.

http://www.skipy.ru/technics/encodings.html


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
lat
Дата 4.2.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Skipy @  3.2.2011,  17:55 Найти цитируемый пост)
http://www.skipy.ru/technics/encodings.html 


Прочитал, очень достойная работа. Грамотно написано. 

Внимание, теперь вопрос ...

Код

String targetText = "ЫЫЫ";
System.out.println("TargetText: " + targetText);
System.out.println("-----------------------------------------------");
SortedMap<String, Charset> charsetsMap = Charset.availableCharsets();
System.out.println("Charsets available: " + charsetsMap.size());     
System.out.println("-----------------------------------------------");
for(String name : charsetsMap.keySet())
{
   InputStream stream = new StringBufferInputStream(targetText);
   BufferedReader br = new BufferedReader(new InputStreamReader(stream, name));            
   System.out.println("Charset: " + name + " ===> " + br.readLine());
}


Console:
Код

TargetText: ЫЫЫ
-----------------------------------------------
Charsets available: 38
-----------------------------------------------
Charset: IBM00858 ===> +++
Charset: IBM437 ===> +++
Charset: IBM775 ===> +++
Charset: IBM850 ===> +++
Charset: IBM852 ===> +++
Charset: IBM855 ===> +++
Charset: IBM857 ===> +++
Charset: IBM862 ===> +++
Charset: IBM866 ===> +++
Charset: ISO-8859-1 ===> +++
Charset: ISO-8859-13 ===> +++
Charset: ISO-8859-15 ===> +++
Charset: ISO-8859-2 ===> +++
Charset: ISO-8859-4 ===> +++
Charset: ISO-8859-5 ===> +++
Charset: ISO-8859-7 ===> +++
Charset: ISO-8859-9 ===> +++
Charset: KOI8-R ===> +++
Charset: KOI8-U ===> +++
Charset: US-ASCII ===> +++
Charset: UTF-16 ===> ??
Charset: UTF-16BE ===> ??
Charset: UTF-16LE ===> ??
Charset: UTF-32 ===> ?
Charset: UTF-32BE ===> ?
Charset: UTF-32LE ===> ?
Charset: UTF-8 ===> +++
Charset: windows-1250 ===> +++
Charset: windows-1251 ===> +++
Charset: windows-1252 ===> +++
Charset: windows-1253 ===> +++
Charset: windows-1254 ===> +++
Charset: windows-1257 ===> +++
Charset: x-IBM737 ===> +++
Charset: x-IBM874 ===> +++
Charset: x-UTF-16LE-BOM ===> ??
Charset: X-UTF-32BE-BOM ===> ?
Charset: X-UTF-32LE-BOM ===> ?


где же "ЫЫЫ"? =)


Это сообщение отредактировал(а) lat - 4.2.2011, 13:25
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
techmax
Дата 8.2.2011, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 5.9.2007
Где: Красноярск

Репутация: 2
Всего: 2



Из документации по StringBufferInputStream
  Only the low eight bits of each character in the string are used by this class.
Класс deprecated. 
 
PM MAIL Skype   Вверх
Skipy
Дата 11.2.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Так оно никогда не будет работать.  Как сказано в описании класса, StringBufferInputStream, он берет только нижний байт. Строки в памяти в кодировке UTF-16BE, код Ы - 0x042B. Соответственно, во входном потоке у Вас оказываются три байта 0x2B. Когда Вы пытаетесь их интерпретировать однобайтовыми кодировками типа ISO-8859-X, IBMXXX, koi-X или windows-XXXX - Вы получаете три символа '+' (его код - 0x2B), ибо нижняя часть таблицы у этих кодировок совпадает. То же происходит и с UTF-8 - у нее первые 127 символов однобайтовые. Многобайтовые кодировки, естественно, тоже не покажут Вам ничего хорошего.

Это сообщение отредактировал(а) Skipy - 11.2.2011, 15:35


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.