Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1

    [J2ME] From Unicode to UTF-8

    Buongiorno,

    come da titolo, devo ottenere la codifica UTF-8 di una String Unicode, rappresentante una emoticon.

    Esempio:

    Input:
    😀 (
    String)

    Unicode:
    U+1F600

    Output desiderato :

    f0 9f 98 80

    codice:
    String s = "😀";			    byte ptext[] = null;
    				try {
    					ptext = s.getBytes("UTF8");
    				} catch (UnsupportedEncodingException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			    for (int i = 0; i < ptext.length; i++) {
    			      System.out.print(ptext[i] + ",");
    
    			    }


    Ho provato questo codice, ma i bytes risultanti sono:

    -19,-96,-67,-19,-72,-128

    Che mi sembrano abbastanza lontani dal risultato desiderato...

    Come posso ottenere l'HEX di cui sopra?

  2. #2
    Ciao ti basta formattare la stringa in esadecimale (ovviamente utilizzanto UTF-8).
    codice:
    System.out.println(String.format("%x", new BigInteger(1, s.getBytes("UTF-8"))));

  3. #3
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    Ciao ti basta formattare la stringa in esadecimale (ovviamente utilizzanto UTF-8).
    codice:
    System.out.println(String.format("%x", new BigInteger(1, s.getBytes("UTF-8"))));
    In J2ME, ho accesso al solo moetodo format che prende in entrata una String e un array di Object...

  4. #4
    Bè basta scriversi il proprio algoritmo di decodifica....
    codice:
    final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
    
    
    	public static String bytesToHex(byte[] bytes)
    	{
    		char[] hexChars = new char[bytes.length * 2];
    		for (int j = 0; j < bytes.length; j++)
    		{
    			int v = bytes[j] & 0xFF;
    			hexChars[j * 2] = hexArray[v >>> 4];
    			hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    		}
    		return new String(hexChars);
    	}

  5. #5
    Mi sono confuso un attimo...

    Non posso passare come input la stringa "
    ��
    ". Posso unicamente passare al mio metodo

    l'unicode (
    U+1F600)
    i chars rappresentanti l'emoticon (\uD83D\uDE03)

    Come output l'esadecimale.

    Quindi è sbagliato cosa ho scritto... Non posso passare come input direttamente la stringa.

    Come posso muovermi?

  6. #6
    Sinceramente non ho capito quale sia il problema ?

  7. #7
    Mi scuso per non essere chiaro. Mi sono reso conto che, rileggendo il post, non lo sono stato affatto.


    Il metodo che mi ha scritto prima (bytesToHex) prende in input un array di byte.


    Quale deve essere l'input nel mio caso?


    System.out.printl(bytesToHex("????".getBytes("UTF-8"));

    Con cosa sostituisco ????

    Con "
    ��
    " no, non posso farlo....

  8. #8
    Lo puoi sostituire con qualunque stringa
    codice:
    System.out.println(bytesToHex("��".getBytes("UTF-8")));
    System.out.println(bytesToHex("\uD83D\uDE03".getBytes("UTF-8")));

  9. #9
    Seguendo il codice, dopo aver testato quanto segue

    codice:
    System.out.println(bytesToHex("\uD83D\uDE03".getBytes("UTF-8")));
    Il syso produce questo:

    EDA0BDEDB883

    Stesso risultato se inserisco la stringa "😀" invece dei 2 chars.

    Il risultato atteso è però:

    f0 9f 98 80

    Dico questo perché, da tabella Unicode - UTF-8, il risultato è corretto.

    Inoltre, dal risultato, vedo che è diverso il numero di esadecimali.

    Non so davvero come muovermi...

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Io per convertire un array di byte nella relativa rappresentazione esadecimale, uso questa:

    codice:
       public static String bytesToHex(byte[] b) {
            StringBuilder ret = new StringBuilder();
            int temp = 0;
            for(int i=0; i<b.length; i++) {
                temp = b[i];
                if (temp < 0) temp += 256;
                ret.append( (temp < 16) ? "0" + Integer.toHexString(temp) : Integer.toHexString(temp) );
            }
    
            return ret.toString();
       }


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.