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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Немецкая ОС, JAVA и кодировка 
:(
    Опции темы
LSD
Дата 6.2.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(sergej.z @ 6.2.2006, 21:01 Найти цитируемый пост)
Результат можно интерпретировать. как то, что кодировка самого исходника не 1251, верно?

К сожалению нет (вернее скорее всего в БД то, кодировка 1251).

Первая строка это коды русского алфавита в кодировке UTF-16. Вторая это коды русского алфавита в кодировке windows-1251.
А вот третья это коды русского алфавита неправильно преобразованного в UTF-16. При преобразовании байт из windows-1251 C0 заменяется на 410, C1 на 411, и т.д. А здесь коды не были корректно преобразованы, просто лепили как есть и все. Такое може происходить если перекодировать из ISO-8859-1.

Вот примерчик где этот эффект демонстрируется преобразование кодировок (попробуй кодировки US-ASCII и windows-1251):
Код
byte[] data = new byte[256];
for(int i = 0; i < data.length; i++)
  data[i] = (byte) i;
String str = new String(data, "ISO-8859-1");
for(int i = 0; i < str.length(); i++)
  System.out.print(Integer.toHexString(0xFFFF & str.charAt(i)) + " ");
System.out.println();


Преобразовать конечно данные не составит труда:
Код
byte[] buffer = new byte[str.length()];
for(int i = 0; i < str.length(); i++)
  buffer[i] = (byte) str.charAt(i);
String correctString = new String(buffer, "windows-1251");


Можно попробовать получить "сырое" значение через resultSet.getBytes("column").

P.S. Скачал себе MySQL, попробую с ним поиграться.
Добавлено @ 21:58
Цитата(sergej.z @ 6.2.2006, 21:28 Найти цитируемый пост)
Kaзчется я понимаю... Исходник всегда компилится в УТФ-8, верно?

Нет, должна быть настройка которая определяет кодировку исходника. Для javac это параметр -encoding, у эклипсы не знаю.
Вообщем я не понял, что ты сделал. Но если русская А прописанная в виде литерала, имеет код 410, значит для исходника используется правильная кодировка.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergejzr
Дата 6.2.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Итак, подведём итоги.
Если выписывать строки из БД напрямую на сокет - кодировка CP1251 совпадает и всё отображается корректно. Это очень хорошо.
В тоже время русские литералы исходника (который тоже в CP1251) превращаются в знаки вопроса.

Цитата(LSD @ 6.2.2006, 19:53 Найти цитируемый пост)

Вообщем я не понял, что ты сделал. Но если русская А прописанная в виде литерала, имеет код 410, значит для исходника используется правильная кодировка.

Значит по теории у меня всё правильно. Но это означает, что все русские литералы перед выводом на сокет надо конвертить, ведь верно отображается именно А - с0

В принципе конечно хотелось бы обойтись совсем без конвертации, но если это невозможно, то надо определится (мне) или базу конвертить под исходник или исходник под базу. По большому счёту это не играет роли, потому что загрузка строк в мозги будет проведена только один раз при инициализации. С другой стороны не хочется следить за каждой константой в исходнике.

Короче говоря, хотелось бы обойтись совсем без конвертации. Чтобы кодировка файла и строк совпадала. Это означает, что файл надо в другую кодировку перенести, но в какую???? Если 1251 не работает..


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 7.2.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(sergej.z @ 6.2.2006, 23:25 Найти цитируемый пост)
Короче говоря, хотелось бы обойтись совсем без конвертации. Чтобы кодировка файла и строк совпадала. Это означает, что файл надо в другую кодировку перенести, но в какую???? Если 1251 не работает..

Исходник сохраняй в windows-1251, а при компиляции указывай что он ISO-8859-1.

Но это все полумеры, которые могут потом боком выйти. По хорошему надо привести базу в норму. Либо разобраться почему у нас не работает русский язык (кстати а что с другими языками?), но тут похоже сделали все что смогли. Либо пересоздать базу и сделать export/import.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Nobody
Дата 7.2.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



sergej.z
Переделай всё в UTF-8 и не извращайся.


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
Wowa
Дата 7.2.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(Nobody @ 7.2.2006, 11:37 Найти цитируемый пост)

Переделай всё в UTF-8 и не извращайся.

речь идет о базе этого форума. Я думаю, что если все сообщения станут в utf-8. Тем самым начнут почти в два раза больше места занимать - никто не обрадуется. Т.к. у многих еще модемы.
Да и база форума, которая сейчас весит около 400Мб, станет весит наверное 600-700Мб.
PM WWW   Вверх
sergejzr
Дата 7.2.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(LSD @ 7.2.2006, 10:14 Найти цитируемый пост)

Либо пересоздать базу и сделать export/import.



Цитата(Nobody @ 7.2.2006, 11:37 Найти цитируемый пост)

sergej.z
Переделай всё в UTF-8 и не извращайся.


Ну так вес страницы ведь увеличится для юзеров. Поэтому извращатся и приходится.

Цитата(LSD @ 7.2.2006, 10:14 Найти цитируемый пост)

Исходник сохраняй в windows-1251, а при компиляции указывай что он ISO-8859-1.


Так как всё равно транслятор надо делать, все киррилические строки будут в двух местах хранится. В базе и трансляторе. В принципе не сложно их в трансляторе один раз при старте перекодировать. Проблема только с ХТМЛ комментами, прописанными в строках, но тут можно траблу обойти разделив на ХМЛ и ХСЛ. И ХСЛ из файла читать, он ведь тогда сразу будет в правильной кодировке.
Думаю - это оптимальное решение smile Тему пока оставим подогретой. Ведь неизвестно, где ещё бяки с кодировкой вылезут. А Насчёт ХСЛ - это уже другая тема будет smile

Всем спасибо!


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 7.2.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Wowa @ 7.2.2006, 13:39 Найти цитируемый пост)
речь идет о базе этого форума. Я думаю, что если все сообщения станут в utf-8. Тем самым начнут почти в два раза больше места занимать - никто не обрадуется. Т.к. у многих еще модемы.
Да и база форума, которая сейчас весит около 400Мб, станет весит наверное 600-700Мб.

Цитата(sergej.z @ 7.2.2006, 13:50 Найти цитируемый пост)
Ну так вес страницы ведь увеличится для юзеров. Поэтому извращатся и приходится.

Я не об этом.
Я говорю о том, у нас внутри Java приложения есть строка в которой содержится обракадабра. Например символы \u00D7 и \u00F7 выдают Character.isLetter() - false (это русская Ч). Ни в верхний ни в нижний регистр ее перевести нельзя, регулярные выражение которые используют шаблон \w будут на ней спотыкаться и еще неизвестно какие баги вылезут. Поэтому нам важно получить в Java приложение строку в нормальной кодировке. А уже пользователю можно выдавать и windows-1251 и UTF-8 как захотим. И в базе можем хранить тоже как нам удобно, главное чтоб могли правильно прочитать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergejzr
Дата 7.2.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(LSD @ 7.2.2006, 13:12 Найти цитируемый пост)

Я говорю о том, у нас внутри Java приложения есть строка в которой содержится обракадабра. Например символы \u00D7 и \u00F7 выдают Character.isLetter() - false (это русская Ч). Ни в верхний ни в нижний регистр ее перевести нельзя, регулярные выражение которые используют шаблон \w будут на ней спотыкаться и еще неизвестно какие баги вылезут. Поэтому нам важно получить в Java приложение строку в нормальной кодировке. А уже пользователю можно выдавать и windows-1251 и UTF-8 как захотим. И в базе можем хранить тоже как нам удобно, главное чтоб могли правильно прочитать.

Ну это не страшно. Из кириллицы в исходниках только надписи. Обрабатывать нам их не надо просто на сокет выдавать как есть. Перекодировать каждый раз на выходе - лишняя трата ресурсов. Тем более, что из транслятора мы можем по надобности эту строку в любой кодировке запросить.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 9.2.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(sergej.z @ 7.2.2006, 15:36 Найти цитируемый пост)
Из кириллицы в исходниках только надписи.

Я говорил о строках получаемых из базы, их-то обрабатывать придется.

Цитата(sergej.z @ 7.2.2006, 15:36 Найти цитируемый пост)
Перекодировать каждый раз на выходе - лишняя трата ресурсов.

Не такая уж и большая. Я накидал тестик:
Код
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.charset.*;
import java.nio.*;

public class EncodingTest
{
  private static String inputFileName;
  private static String outputFileName;
  private static CharsetDecoder decoder;
  private static CharsetEncoder encoder;
  private static int iterations;

  public static void main(String[] args)
  {
    init(args);

    for(int i = 1; i <= iterations; i++)
    {
      System.out.println("Iteration " + i + " running...");
      try
      {
        long time = doDecode();
        System.out.println("Iteration " + i + " finished for " + time + " msec");
      }
      catch(IOException e)
      {
        System.out.println("Error during iteration " + i + ": " + e);
      }
    }
  }

  private static void init(String[] args)
  {
    if(args.length < 4)
    {
      System.err.println("Usage: java EncodingTest <input_file> <input_encoding> <output_file> <output_encoding> [number_of_iterations]");
      System.err.println("Example: java EncodingTest in.txt Cp866 out.txt Cp1251 10");
      System.exit(1);
    }

    inputFileName = args[0];
    outputFileName = args[2];
    try
    {
      decoder = Charset.forName(args[1]).newDecoder();
      encoder = Charset.forName(args[3]).newEncoder();
    }
    catch(UnsupportedCharsetException e)
    {
      System.err.println("Invalid charset name: " + e.getCharsetName());
      System.exit(1);
    }
    catch(UnsupportedOperationException e)
    {
      System.err.println("Couldnot encode in charset: " + args[3]);
      System.exit(1);
    }

    iterations = 5;
    try
    {
      if(args.length > 4)
        iterations = Integer.parseInt(args[4]);
    }
    catch(NumberFormatException e)
    {
      System.err.println("Invalid number of iterations: " + args[4]);
      System.exit(1);
    }
  }

  private static long doDecode() throws IOException
  {
    RandomAccessFile inFile = new RandomAccessFile(inputFileName, "r");
    RandomAccessFile outFile = new RandomAccessFile(outputFileName, "rw");
    long size = inFile.length();
    MappedByteBuffer inBuffer = inFile.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, size);
    MappedByteBuffer outBuffer = outFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, size);

    long time = System.currentTimeMillis();
    CharBuffer buffer = decoder.decode(inBuffer);
    encoder.encode(buffer, outBuffer, true);
    time = System.currentTimeMillis() - time;

    inFile.close();
    outFile.close();
    inBuffer = null;
    outBuffer = null;
    inFile = null;
    outFile = null;
    System.gc();
    System.gc();
    System.gc();

    return time;
  }
}

Прогнав его на файле в 1Мб (перегонял из Cp866 в Cp1251) получил такие результаты:
Код
Iteration 1 running...
Iteration 1 finished for 109 msec
Iteration 2 running...
Iteration 2 finished for 47 msec
Iteration 3 running...
Iteration 3 finished for 31 msec
Iteration 4 running...
Iteration 4 finished for 32 msec
Iteration 5 running...
Iteration 5 finished for 31 msec
Iteration 6 running...
Iteration 6 finished for 31 msec
Iteration 7 running...
Iteration 7 finished for 31 msec
Iteration 8 running...
Iteration 8 finished for 32 msec
Iteration 9 running...
Iteration 9 finished for 31 msec
Iteration 10 running...
Iteration 10 finished for 47 msec
Iteration 11 running...
Iteration 11 finished for 47 msec
Iteration 12 running...
Iteration 12 finished for 31 msec
Iteration 13 running...
Iteration 13 finished for 31 msec
Iteration 14 running...
Iteration 14 finished for 47 msec
Iteration 15 running...
Iteration 15 finished for 31 msec
Iteration 16 running...
Iteration 16 finished for 47 msec
Iteration 17 running...
Iteration 17 finished for 31 msec
Iteration 18 running...
Iteration 18 finished for 47 msec
Iteration 19 running...
Iteration 19 finished for 31 msec
Iteration 20 running...
Iteration 20 finished for 47 msec

Заглавная страница винграда 150Кб, в ней большая часть текста идет латиницей, и преобразовывать надо будет только в одну сторону. Так что преобразование будет потреблять около 5мсек.
Добавлено @ 00:23
P.S. Вот что по этому поводу думает Sun: Character Conversions from Browser to Database.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
vinegr
Дата 9.2.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



извините, если это уже сказали до меня - но есть прекрасный мануал
"JAVA -русские буквы и не только" (в инете сотня копий, ищется слету)
берете и осмысливаете с заменой "русскости" на "немецкость" smile
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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