Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Проблема с выводом русского текста


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

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

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

Строка 
Код

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

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

Автор: eugine_s 12.1.2009, 23:08
Цитата(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)


и что ты хотел сделать этим? строка + символ = строка_с_этим_символом - как тебе это должно помочь?

Автор: math64 13.1.2009, 09:37
Код

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;
}

Автор: eugine_s 13.1.2009, 12:51
math64, я не думаю что такой код требуется, так как:

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


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


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

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

2) так же возможно еще одна проблема: как выводится текст на экран. если используется свой шрифт, то возможно там какие-то проблемы, но вероятнее всего п1.

Автор: Mind_master 13.1.2009, 16:19
да, как я понял, проблема именно в преобразовании

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

З.Ы. знаки вопроса выводятся если ничего не делать с массивом (т.е. byte для хранения не подходит)

Автор: W0LF 13.1.2009, 17:04
Код

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

Автор: Mind_master 13.1.2009, 19:08
Всем спасибо, разобрался  smile  smile  smile 

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

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

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

В чём может быть проблема - с кодировками?

Автор: ivanovpv 12.5.2010, 07:43
Ну вы даете... Рассказываю правильный способ работы с байтами строк в 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;
        }
    }


Автор: W0LF 12.5.2010, 18:02
Цитата

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

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

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

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

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

Автор: ivanovpv 13.5.2010, 08:45
Цитата(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

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

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

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