Konwersja String

Odpowiedz Nowy wątek
2011-10-11 08:42
0

Witam

Mam problem z prostym przetwarzaniem Stringa. Przytoczony fragment kodu jest uproszczeniem problemu, który występuje w innym większym projekcie.

W konsoli wczytuje znak (System.in.read()). Wprowadzam znak np. ą. Następnie wyświetlam sobie wartość, którą otrzymałem po wczytaniu czyli 185.

Teraz ten sam wynik chcę uzyskać dla zmiennej String znak = "ą". Jak przetworzyć tego stringa tak, żeby dla ą uzyskać wartość 185? Podobnie dla ś wartość 156, dla ć wartość 230 itd.

Poniżej kod.

import java.io.IOException;

public class Przetwarzanie_znakow {

    public static void main(String[] args) {

        System.out.print("Podaj znak: ");
        int wczytany_znak = 0;
        try {
            wczytany_znak = System.in.read();
        } catch (IOException exp) {
            exp.printStackTrace();
        }
        System.out.println("Po wczytaniu otrzymałem: " + wczytany_znak);

        int przetworzony_znak = 0;
        String znak = "ą";

        // co tutaj powinno być, żeby uzyskać ten sam wynik co dla System.in.read() ???

        System.out.println("Po przetwarzaniu Stringa otrzymałem: " + przetworzony_znak);
    }

}

Proszę o pomoc.

edytowany 1x, ostatnio: ksarim, 2011-10-11 08:44

Pozostało 580 znaków

2011-10-11 09:53
bo
0

Dlaczego uważasz, że 185 jest poprawne? Liczba ta zależy od kodowania (strony kodowej). Konsola ma odmienne kodowanie.

Pozostało 580 znaków

2011-10-11 10:23
0

Właśnie ten rodzaj kodowania jest mi potrzebny w projekcie. Jak go uzyskać dla Stringa?

edytowany 1x, ostatnio: ksarim, 2011-10-11 10:24

Pozostało 580 znaków

2011-10-11 16:57
0

String.charAt(0)

Pozostało 580 znaków

2011-10-11 16:59
0

String.charAt(0) - niestety ta metoda zwraca zupełnie inne wartości

Pozostało 580 znaków

2011-10-11 17:18
0
    String dupa = "ą";
    byte[] b = dupa.getBytes("jakies kodowanie");

    int n = 0;
    if(b.length>1)
        n = (b[0]&0xFF) << 8 | (b[1]&0xFF);
    else if(b.length>0)
        n = b[0]&0xFF;

    System.out.println(n);

Pozostało 580 znaków

2011-10-11 17:37
0

Działa. Dzięki.

Czy kolega może rozwinąć z czego wynika ten fragment kodu:

        if(b.length>1)
                n = (b[0]&0xFF) << 8 | (b[1]&0xFF);
        else if(b.length>0)
                n = b[0]&0xFF;  
z tego, że getBytes nawet dla jedej literki może zwrócić dwa bajty... albo więcej (ale więcej mi się nie chciało robić) - Kerai 2011-10-11 17:43
Nawet musi bo kodowanie w Javie, to zawsze UTF-16 (char ma 16-bitów). W przypadku chińszczyzny i innych obrazków kodowanych w UTF-32 zapis jest jest w górnym i dolnym słowie (char) po sobie, więc zwróci 4 bajty. - Olamagato 2011-10-11 22:23
Nie musi.. znak 'a' to zwykle jeden bajt.. 97 ... zaś znak 'ą' to w cp1252 (czyli to co ma windowsowa konsola) jeden bajt 63, a dopiero w utf8 są to dwa bajty 196 i 133 - Kerai 2011-10-11 22:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0