powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Кириличные символы в веб приложении
16 сообщений из 16, страница 1 из 1
Кириличные символы в веб приложении
    #38093099
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет люди!
Снова есть баг)
Есть веб проект на JSF, работает на Glassfish сервере. Как БД использует MySQL.
В самом проекте есть сервлет-фильтр, которий перекодирует все дание, которые приходят от запросов (GET, POST) в UTF-8.
Схема и таблицы в MySQL тоже в UTF-8.
Даже в настройках пула на Glassfish стоит CharacterEncoding=UTF-8.
Этот проект общается с другим таким проектом с помощю SOAP. Все собщения шыфруются с помощю симетрических ключей "DSA".
Теперь представте что два єтих приложения стоят на Windows. Они обмениваются сообщения ми на кирилице и все нормально.
А вот если одно приложение на Windows, а другое на Linux, то все кириличные сообщения портятся, непонятно почему.

Тобто все кириличные даные, которые приходят с Windows на Linux (и на оборот) через SOAP, портятся.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093104
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стока всего наплели. Используйте отладку. Локализуйте проблему. Она в SOAP? Тогда при чему тут JSF и БД?
Покажите как именно портится текст.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093129
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такое выходит:
"РґРєРёР№"
Если смотреть в дебегере, то видно: что з на Windows в момет отправки через SOAP все нормально. А вот на Linux приходят крякозябры.
Код: java
1.
2.
System.out.println(Charset.defaultCharset());
На Windows и Linux дает UTF-8;
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093169
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111,
в SOAP не важен отправитель. Т.е. на какой он платформе и т.д.
Смотрите и трассируйте сам SOAP пакет и его содержимое.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093170
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут очевидно что UTF8 прочитан как CP1251, но кто не в курсе
берем
http://www.artlebedev.ru/tools/decoder/
и оно нам подтверждает.

Тем более удивительно что это происходит в Windows->Linux. В другую сторону я бы ещё мог понять.
Какими средствами происходит работа с SOAP?
Можете ли сделать дамп SOAP/HTTP в файл, и проверить содержимое файла на правильность кодировки.
Какое отношение к этому может иметь фильтр и что значит "перекодирует"?

Может у вас формируется текст под виндой в CP1251, ломая UTF-8, и вы своим фильтром восттанавливали обратно CP1251,
а при переходе не Linux отправка стала работать в UTF-8, но ваш фильтр всё ещё не верно трактует это как CP1251?
Что конкретно делает фильтр и как это относится к SOAP?
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093172
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
denis11111,

Вияснилось, що String в JAVA по умолчанию UTF-16.
И если делать так:
Код: java
1.
String unWrapAnswer = new String(unWrapAnswer.getBytes(), "UTF-8");



То крякозябры пропадают.
Вроде как и решение, но на каждую строку ставить такое как-то не выход...
Может есть какие идеи?
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093173
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Ищо раз проверили. Действительно, только из Linux в Windows.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093195
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Вияснилось, що String в JAVA по умолчанию UTF-16.

facepalm... Это представление данных в памяти, оно к вашей проблеме вообще никакого отношения не имеет


denis11111
Код: java
1.
String unWrapAnswer = new String(unWrapAnswer.getBytes(), "UTF-8");



Это бред, потому что getBytes() использует текущую кодировку.
В вашем случае
Код: java
1.
String unWrapAnswer = new String(unWrapAnswer.getBytes("CP1251"), "UTF-8");


Т.е. у вас был текст в UTF-8 и вы его невалидно интерпретировали где-то как CP1251.
Этой операцией вы пытаетесь восстановить данные делая преобразование в обратном порядке.
Получить из String CP1251 и интерпретировать как UTF-8.
Это костыль, при чем со своими побочными эффектами. Какие-то символы могут не восстановится в таком преобразовании. "Щ" что ли... не помню точно.


denis11111То крякозябры пропадают.
Вроде как и решение, но на каждую строку ставить такое как-то не выход...
Может есть какие идеи?
Всё традиционно. Проблему нужно локализовать и устранить. Локализация происходить двоичным поиском. Делим попалам - справа Win, слева Линь. Посередине SOAP. Далем дамп запроса и ответа. Смотрим кодировку. Определяем кто набочил.
Затем на нужном сервервере делем транзакцию пополам. Дебажим в середине и определяем текст сломан раньше или позже.
И так пока не выявим где именно проблема.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093545
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz[
Код: java
1.
String unWrapAnswer = new String(unWrapAnswer.getBytes("CP1251"), "UTF-8");


Т.е. у вас был текст в UTF-8 и вы его невалидно интерпретировали где-то как CP1251.
Этой операцией вы пытаетесь восстановить данные делая преобразование в обратном порядке.
Получить из String CP1251 и интерпретировать как UTF-8.
Это костыль, при чем со своими побочными эффектами. Какие-то символы могут не восстановится в таком преобразовании. "Щ" что ли... не помню точно.


Так если так поставить то уже в Linux будут проблемы.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093569
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Так если так поставить то уже в Linux будут проблемы.
Во-первых. Я не говорю что это нужно делать. Это заплатка, причем, возможно, не работающая.

Во-вторых, вы где-то лукавите.
"РґРєРёР№" это UTF-8 текст, прочитаный как CP1251.
Charset.defaultCharset() везде UTF-8.
Тогда в вашем случае
Код: java
1.
String unWrapAnswer = new String(unWrapAnswer.getBytes(), "UTF-8");


это всё равно что
Код: java
1.
String unWrapAnswer = new String(unWrapAnswer.getBytes("UTF-8"), "UTF-8");


Что никак не может видоизменить текст.

В случае "РґРєРёР№" текст можно "исправить" как раз кодом
String unWrapAnswer = new String(unWrapAnswer.getBytes("CP1251"), "UTF-8");
Выходит Charset.defaultCharset() у вас где-то CP1251 и вы нас обманули.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093633
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВ случае "РґРєРёР№" текст можно "исправить" как раз кодом
String unWrapAnswer = new String(unWrapAnswer.getBytes("CP1251"), "UTF-8");
Выходит Charset.defaultCharset() у вас где-то CP1251 и вы нас обманули.

Так, есть что-то новое:

Charset.defaultCharset() - это я делал проверку в простой програме с методом main, там "UTF-8".
Когда я закинул Charset.defaultCharset() в код веб приложения, то оказалось что там "windows-1251".
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093719
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Charset.defaultCharset() - это я делал проверку в простой програме с методом main, там "UTF-8".
Когда я закинул Charset.defaultCharset() в код веб приложения, то оказалось что там "windows-1251".
Да, только windows-1251 это нативное имя для NIO. Кроссплатформеное для ваших нужд именно cp1251.
Вот тут полный список
http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html
Иногда стоит по нему сверятся.
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093774
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно заменить это дело на "UTF-8", и как примерно это зделать?

В файле glassfish-web.xml поставил <parameter-encoding default-charset="UTF-8" />, не помогло...
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093781
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это глобальное свойство JVM file.encoding. Вряд ли оно конфигуриуется на уровне отдельного модуля.
-Dfile.encoding в параметрах запуска glassfish
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38093835
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

О!, это помогло)

Glassfish->server-config->JVM Settings->JVM Options , и сюда вписать параметр: "-Dfile.encoding=UTF8"
...
Рейтинг: 0 / 0
Кириличные символы в веб приложении
    #38094737
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВияснилось, що String в JAVA по умолчанию UTF-16.

String в ява имеет по умолчанию кодировку платформы что для винь систем UTF-16 BE ежли не ошибаюсь.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Кириличные символы в веб приложении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]