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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с выводом русского текста, возможно кодировка 
V
    Опции темы
Mind_master
Дата 12.1.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В программе я беру введенный в поле ввода текст, перевожу его  в byte массив, после чего прибавляю/отбавляю байты.
После чего делаю 
Код

  outF.setString(new String(b));
 где b тот самый массив байт.

Английский язык выводит правильно, а вместо русского только знаки вопроса (пробовал на нокии с40 и какомто сони ериксоне  smile  ).

Строка 
Код

outF.setString(outF.getString() + (char)((xres >= 0xc0 && xres <= 0xFF) ? (xres + 0x350) : xres));
 где xres элемент массива, не помогает smile 
 

В чем может быть проблема?
 smile 

PM MAIL ICQ   Вверх
eugine_s
Дата 12.1.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mind_master @  12.1.2009,  20:23 Найти цитируемый пост)
чего прибавляю/отбавляю байты


прикольно smile

Я думаю вся проблема в том что ты делаешь с этими байтами...

Не забыл что строки в java храняться в utf - т.е. русские символы занимают не один байт?

Цитата(Mind_master @  12.1.2009,  20:23 Найти цитируемый пост)
outF.getString() + (char)((xres >= 0xc0 && xres <= 0xFF) ? (xres + 0x350) : xres)


и что ты хотел сделать этим? строка + символ = строка_с_этим_символом - как тебе это должно помочь?
PM MAIL   Вверх
math64
Дата 13.1.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Код

static final String rus = "АБВГДЕЖЗ...ЮЯабвгдежз..юя";
char fromCp1251(byte b) {
int i = b & 0xFF; // байт -128...+127, нам нужно 0...255
if (i >= 0xC0 && i <= 0xFF)
  return rus.charAt(i-0xC0);
return (char)i;
}

PM   Вверх
eugine_s
Дата 13.1.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



math64, я не думаю что такой код требуется, так как:

Цитата(Mind_master @  12.1.2009,  20:23 Найти цитируемый пост)
В программе я беру введенный в поле ввода текст


т.е. строка уже в utf и преобразовывать ее не нужно из 1251 в utf


Я вижу 2 варианта проблемы: 

1) как уже описывал выше - возможно проблема в преобразовании. Что там делается с байтами?

2) так же возможно еще одна проблема: как выводится текст на экран. если используется свой шрифт, то возможно там какие-то проблемы, но вероятнее всего п1.
PM MAIL   Вверх
Mind_master
Дата 13.1.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да, как я понял, проблема именно в преобразовании

таким образом вопрос: как прибавлять/отнимать байты (чтобы получилась следующая/предыдущая буква, символ) у символов UTF ?

З.Ы. знаки вопроса выводятся если ничего не делать с массивом (т.е. byte для хранения не подходит)
PM MAIL ICQ   Вверх
W0LF
Дата 13.1.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Код

String sourceString = "АБВГДЕ";
        char[] sourceStringCharArray = sourceString.toCharArray();
        char[] destStringCharArray = new char[sourceStringCharArray.length + 1];
        System.arraycopy(sourceStringCharArray, 0, destStringCharArray, 0, sourceStringCharArray.length);
        destStringCharArray[sourceStringCharArray.length] = ++sourceStringCharArray[sourceStringCharArray.length - 1];

        sourceString = new String(destStringCharArray);
        System.out.println(sourceString.toCharArray());

с "Ё" не получится.
В j2me System.arraycopy нет

Быстро, но через заднее место smile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Mind_master
Дата 13.1.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо, разобрался  smile  smile  smile 

Это сообщение отредактировал(а) Mind_master - 13.1.2009, 19:11
PM MAIL ICQ   Вверх
John2
Дата 12.5.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня аналогичная проблема. Ситуация с массивами byte, хранящимися в RMS. При преобразовании из byte[] в String, в эмуляторе выводятся правильно русские буквы.
Код

recordStore.setRecord( 1, "слово".getBytes(), 0, "слово".length() );
// извлекаю и преобразую запись
String str = new String( recordStore.getRecord( 1 ) );
System.out.println( str ); // здесь всё чётко: "слово"
// на экране эмулятора тоже

А в телефоне Nokia выводятся знаки вопроса - "?????".

В чём может быть проблема - с кодировками?
PM MAIL   Вверх
ivanovpv
Дата 12.5.2010, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


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

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



Ну вы даете... Рассказываю правильный способ работы с байтами строк в J2ME:
1) Правильно переводим String в массив байтов
Код

 public static final String ENCODING="ISO-8859-1";

    public static byte[] stringToByteArray(String s)
    {
        try
        {
            return s.getBytes(ENCODING);
        }
        catch (UnsupportedEncodingException ex)
        {
            return null;
        }
    }


байты получаются из стринга все время разные в зависимости от кодировки. Если не указывать кодировку, то будет взята кодировка по умолчанию, которая зависит от положения луны на небосклоне (проще говоря в зависит от локали и модели тилипона) - посему настоятельно рекомендуется вручную указывать кодировку. Рекомендуется или ISO-8859-1 или UTF-8 - поскольку они поддерживаются всегда.

2) Чегой-то делаем с байтами. Кстати, вынужден опровергнуть уважаемого W0LF, System.arraycopy() в J2ME есть!

3) Массив байтов переводим обратно в String тем же макаром, ну или более затейливо, а именно с оффсетом в массиве:
Код

    public static String byteArrayToString(byte[] buf, int offset)
    {
        try
        {
            return new String(buf, offset, buf.length-offset, ENCODING);
        }
        catch (UnsupportedEncodingException ex)
        {
            return null;
        }
    }



Это сообщение отредактировал(а) ivanovpv - 12.5.2010, 07:45


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
W0LF
Дата 12.5.2010, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата

2) Чегой-то делаем с байтами. Кстати, вынужден опровергнуть уважаемого W0LF, System.arraycopy() в J2ME есть!

ну, след раз апи смотреть буду, прежде чем писать =) я уже три года под j2me не пишу, да и вообще под java =)


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
John2
Дата 12.5.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, с UTF-8 получилось, а с ISO-8859-1 нет.
Но здесь другая проблема - никак не дойдёт.  При извлечении из rms String получается вдвое короче, чем начальная. 
Поиски информации по конструкторам и методам классов String и Byte успехом не увенчались.

Пожалуйста помогите разобраться
Цитата(ivanovpv @  12.5.2010,  07:43 Найти цитируемый пост)
2) Чегой-то делаем с байтами.

Что Вы здесь имели ввиду - обычная процедура для сохранения данных или как раз какая-то особая обработка массивов байт?

PM MAIL   Вверх
ivanovpv
Дата 13.5.2010, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


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

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



Цитата(John2 @  12.5.2010,  18:47 Найти цитируемый пост)
Пожалуйста помогите разобраться


По хорошему надо делать так:
Код

String s="слово";
//преобразуем строку в массив байтов
byte[] buffer=stringToByteArray(s);

// ******* далее работаем с байтами

// recordStore.setRecord( 1, "слово".getBytes(), 0, "слово".length() ); - так нельзя потому что "слово".length() короче в два раза чем истинный размер массива байтов!
// помни в Java 2 байта = 1 char
recordStore.setRecord( 1, buffer, 0, buffer.length ); 
// извлекаем запись в виде массива байтов
buffer=recordStore.getRecord( 1 );

// ******* закончили с байтами - возвращаемся к строкам
String newS=byteArrayToString(buffer, 0);

System.out.println(newS); 



Добавлено через 3 минуты и 36 секунд
Цитата(W0LF @  12.5.2010,  18:02 Найти цитируемый пост)
я уже три года под j2me не пишу


Бывает, а я уже лет 10 не пишу по Сями - так что уже и забыл правила форматирования printf() smile

Это сообщение отредактировал(а) ivanovpv - 13.5.2010, 08:46


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
John2
Дата 18.5.2010, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ivanovpv @  13.5.2010,  08:45 Найти цитируемый пост)
"слово".length() ); - так нельзя потому что "слово".length() короче в два раза

Спасибо! Что называется - просто недосмотрел. Сейчас всё работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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