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


Автор: FiMa1 23.3.2011, 00:24
Ребята, привет всем!

Подскажите, если кто-нибудь сталкивался с подобной проблемой. Не приводятся к нижнему регистру слова, написанные на кириллице.

Код

import javax.microedition.midlet.*;

public class TestMidlet extends MIDlet {
    public TestMidlet() {        
        if ("Привет".equalsIgnoreCase("привет")) {
            System.out.println("Equals!");
        } else {
            System.out.println("Not equals!");
        }

        System.out.println("=== Upper case ===");
        for (int i = 0; i < "Привет".length(); i++) {
            System.out.println("0x" + (int) "Привет".charAt(i) + " ");
        }
        System.out.println("=== toLowerCase ===");
        for (int i = 0; i < "Привет".length(); i++) {
            System.out.println("0x" + (int) "Привет".toLowerCase().charAt(i) + " ");
        }
        System.out.println("=== Lower case ===");
        for (int i = 0; i < "привет".length(); i++) {
            System.out.println("0x" + (int) "привет".charAt(i) + " ");
        }
    }

    protected void startApp() {
    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean bool) {
    }
}

Вывод мидлета:

Код

Running with storage root C:\Documents and Settings\user\j2mewtk\2.5.2\appdb\MediaControlSkin
Running with locale: English_United Kingdom.1252
Running in the identified_third_party security domain
Not equals!
=== Upper case ===
0x1055 0x1088 0x1080 0x1074 0x1077 0x1090 
=== toLowerCase ===
0x1055 0x1088 0x1080 0x1074 0x1077 0x1090 
=== Lower case ===
0x1087 0x1088 0x1080 0x1074 0x1077 0x1090 

Непонятно откуда локаль вылезла English_United Kingdom.1252.

Окружение:
Eclipse Helios Service Release v2
MTJ EclipseME J2ME Development Tools for Eclipse v1.8.0 (тот же результат в Eclipseme v1.7.9)
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
Кодировка файла с исходным кодом: UTF-8

При этом для обычного Java проекта (Java Project/Java Application) имею:

Код

Equals!
=== Upper case ===
0x1055 0x1088 0x1080 0x1074 0x1077 0x1090 
=== toLowerCase ===
0x1087 0x1088 0x1080 0x1074 0x1077 0x1090 
=== Lower case ===
0x1087 0x1088 0x1080 0x1074 0x1077 0x1090 

Автор: ivanovpv 23.3.2011, 09:23
Выбери на эмуляторе правильную локаль и все станет как надо

Автор: oxigen 23.3.2011, 11:06
И будет работать только на телефонах, где стоит "правильная" локаль?

Автор: FiMa1 23.3.2011, 15:42
Цитата(oxigen @ 23.3.2011,  11:06)
И будет работать только на телефонах, где стоит "правильная" локаль?

Ну, собственно проблема и была обнаружена под Java, запущенной из-под WindowsME на телефоне. На эмуляторах WTK также воспроизводится.
ivanovpv, спасибо, попробую сменить локаль отпишусь.

Автор: FiMa1 23.3.2011, 23:04
Цитата(ivanovpv @ 23.3.2011,  09:23)
Выбери на эмуляторе правильную локаль и все станет как надо

В J2ME есть возможность только прочитать текущую локаль, но не установить.

Что же касается моей проблемы - нашел-таки. Даже странно, вчера ну буквально никак не мог поиском выйти на какое-либо описание, а сегодня даже в двух местах сразу. В том числе на этом форуме!

Во-первых: http://stackoverflow.com/questions/3719711/convert-char-to-lower-case-in-j2me-without-using-the-character-class.

Во-вторых: http://forum.vingrad.ru/forum/topic-107944.html

Ну а теперь подтверждение сказанному (http://download.oracle.com/javame/config/cldc/ref-impl/cldc1.1/cldc11api.pdf):
Цитата
Код

toLowerCase(char)

Declaration:
Код

public static char toLowerCase(char ch)

Description:
The given character is mapped to its lowercase equivalent; if the character has no lowercase equivalent, the
character itself is returned.

Note that by default CLDC only supports the ISO Latin-1 range of characters!

Of the ISO Latin-1 characters (character codes 0x0000 through 0x00FF), the following are uppercase:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \u00C0 \u00C1 \u00C2 \u00C3 \u00C4 \u00C5 \u00C6 
\u00C7 \u00C8 \u00C9 \u00CA \u00CB \u00CC \u00CD \u00CE \u00CF
\u00D0 \u00D1 \u00D2 \u00D3 \u00D4 \u00D5 \u00D6 \u00D8 \u00D9
\u00DA \u00DB \u00DC \u00DD \u00DE

Parameters:
ch - the character to be converted.

Returns: the lowercase equivalent of the character, if any; otherwise the character itself.

Since: JDK1.0

Ну и напоследок возможная реализация (ну или типа той, что может быть найдена по ссылке, приведенной выше):

Код

public static String cyrToLowerCase(String str) {
    char[] uppercaseCyrillics = { 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З',
            'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У',
            'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я' };
    char[] lowercaseCyrillics = { 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з',
            'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у',
            'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я' };

    for (int i = 0; i < uppercaseCyrillics.length; i++) {
        str = str.replace(uppercaseCyrillics[i], lowercaseCyrillics[i]);
    }
        
    return str;
}

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