Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как правильно (byte[] -> String)?


Автор: physicist 23.7.2009, 13:48
Итак, пишу я значит портлетик, который аплоадит файл на сервер. Все прекрасно, но в строковых полях формы ломается кодировка. Проблему я решил, но мне кажется, что метод которым я пользовался не true-way.

Теперь подробности. Request из формы парсится с помощью http://commons.apache.org/fileupload/ и строковое поле из него берется с помощью метода:
Код

item.getString()


В итоге на странице возникают кракозяблы, типа: ааа Проблему я решил с помощью следующего кода:
Код

new String(item.get(),"utf8")

где item.get() возвращает массив byte[].

Вопрос: правильно ли все сделал? Можно ли сделать это как-нибудь правильнее?

PS. Пишу здесь, а не в ветке j2ee, потому что вопрос имеет общий характер и решается тривиальным образом. К сожалению, я не знаю как :-(

upd: Если в конструкторе принудительно не указывать кодировку:
Код

new String(item.get())

то проблема остается.

Автор: Andy_L20066 24.7.2009, 13:42
привет, 

Могу предположить что ты делаешь все правильно. new String(byte[]) использует System default encoding. Если у тебя байты твои приходят на сервер из другим типом encoding, то нужно использовать конструктор new String(byte[], сharset). Просто encoding на сервере и клиенте у тебя разные.

Автор: physicist 24.7.2009, 18:27
Andy_L20066, вопрос в том, как установить кодировку по умолчанию, если у сервера стоит другая кодировка? Причем, предположим, что менять настройки сервера нельзя.

Автор: Andy_L20066 24.7.2009, 20:04
а чем тебе нравится указывать его явно? может действительно будет лучше и на клиенте и на сервере иметь один и тот же encoding, задавая его константой... ну что-то типа 
Код

 System.setProperty("file.encoding", "UTF-8");


Добавлено через 3 минуты и 51 секунду
попробуй еще поискать ответ в самом хелпе FileUploaderа (библиотека которую ты используешь для загрузки файла)

Автор: olegrolik 30.7.2009, 11:03
Цитата(physicist @ 24.7.2009,  18:27)
Andy_L20066, вопрос в том, как установить кодировку по умолчанию, если у сервера стоит другая кодировка? Причем, предположим, что менять настройки сервера нельзя.

Я бы предложил использовать фильтр. 
Можно замапить фильтр на все запросы (сервлеты - "/") и указывать определённую кодировку, например cp1251.
Кодировку вынести, скажем в отдельный файл (конфиг).
Фильтр будет брать кодировку из конфига, и при загрузке файла тоже тянешь кодировку из конфига: 
Код

String encoding = ... // read from config
item.getString(encoding);


P.S. правильно ли я понял, что item - это объект класса FileItem? smile

Автор: physicist 30.7.2009, 18:14
[QUOTE=olegrolik,30.7.2009,  11:03]
Цитата(physicist @ 24.7.2009,  18:27)

P.S. правильно ли я понял, что item - это объект класса FileItem? smile

Да. Кстати, спасибо за идею с фильтром. Что-то сразу до нее не догадался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)