[JAVA] char[] naar UTF-8, Unicode scalar values

Pagina: 1
Acties:
  • 74 views sinds 30-01-2008

  • TheOneLLama
  • Registratie: Oktober 2000
  • Laatst online: 20-01-2022

TheOneLLama

A llama like no llama before

Topicstarter
Vraag komt eigenlijk neer op 1 simpel dingetje..
[UPDATE]
Ok wat hier onder staat is opgelost, nu zit ik dus met het probleem dat het ook andersom moet werken.. het gaat om J2ME hier niet om J2SE, dus new String(bytes[], "UTF8") en dergelijk werken niet!! :( :( :(


Ik heb een char[] die ik wil converteren naar UTF-8, daar heb ik bij SUN dit stukje code voor gevonden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
 * Converts an array of Unicode scalar values (code points) into
 * UTF-8. This algorithm works under the assumption that all
 * surrogate pairs have already been converted into scalar code
 * point values within the argument.
 * 
 * @param ch an array of Unicode scalar values (code points)
 * @returns a byte[] containing the UTF-8 encoded characters
 */
public static byte[] encode(int[] ch) {
    // determine how many bytes are needed for the complete conversion
    int bytesNeeded = 0;
    for (int i=0; i<ch.length; i++) {
      if (ch[i] < 0x80) {
        ++bytesNeeded;
      }
      else if (ch[i] < 0x0800) {
        bytesNeeded += 2;
      }
      else if (ch[i] < 0x10000) {
        bytesNeeded += 3;
      }
      else {
        bytesNeeded += 4;
      }
   }
   // allocate a byte[] of the necessary size
   byte[] utf8 = new byte[bytesNeeded];
   // do the conversion from character code points to utf-8
   for(int i=0, bytes = 0; i<ch.length; i++) {
     if(ch[i] < 0x80) {
       utf8[bytes++] = (byte)ch[i];
     }
     else if (ch[i] < 0x0800) {
       utf8[bytes++] = (byte)(ch[i] >> 6 | 0xC0);
       utf8[bytes++] = (byte)(ch[i] & 0x3F | 0x80);
     }
     else if (ch[i] < 0x10000) {
       utf8[bytes++] = (byte)(ch[i] >> 12 | 0xE0);
       utf8[bytes++] = (byte)(ch[i] >> 6 & 0x3F | 0x80);
       utf8[bytes++] = (byte)(ch[i] & 0x3F | 0x80);
     }
     else {
       utf8[bytes++] = (byte)(ch[i] >> 18 | 0xF0);
       utf8[bytes++] = (byte)(ch[i] >> 12 & 0x3F | 0x80);
       utf8[bytes++] = (byte)(ch[i] >> 6 & 0x3F | 0x80);
       utf8[bytes++] = (byte)(ch[i] & 0x3F | 0x80);
     }
  }
  return utf8;
}

Ze willen dus een "an array of Unicode scalar values (code points)"
Hoe converteer een char naar een Unicode scalar value in een int..
Ik vermoed gewoon iets van
code:
1
2
char c = 'a';
int i = (int) c;

Weet iemand of dit de correcte manier is of hoe het wel moet?

Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com


Verwijderd

Waarschijnlijk heb je die char[] ergens uit een stream gelezen; dan kun je beter bij die stream al direkt de character-encoding opgeven, dan hoef je verder nergens meer op te letten. bv "UTF8" of "ISO8859_1" etc.

Dus ipv
new InputStreamReader(InputStream in)

Gebruik je:
new InputStreamReader(InputStream in, String charsetName)

of, in java 1.4:
new InputStreamReader(InputStream in, Charset cs)

  • TheOneLLama
  • Registratie: Oktober 2000
  • Laatst online: 20-01-2022

TheOneLLama

A llama like no llama before

Topicstarter
Op zondag 10 maart 2002 15:12 schreef Bunny het volgende:
Waarschijnlijk heb je die char[] ergens uit een stream gelezen; dan kun je beter bij die stream al direkt de character-encoding opgeven, dan hoef je verder nergens meer op te letten. bv "UTF8" of "ISO8859_1" etc.

Dus ipv
new InputStreamReader(InputStream in)

Gebruik je:
new InputStreamReader(InputStream in, String charsetName)

of, in java 1.4:
new InputStreamReader(InputStream in, Charset cs)
Bedankt voor je oplossing.. ik heb het ondertussen ff snel geimplenteerd en het lijkt allemaal goed te kloppen.. (verwachte ik ook wel), ik vraag/vroeg me ook af hoe dit bij complexe unicode situaties gaat (die char -> int conversie). Ik weet niet goed genoeg hoe JAVA intern met unicode omgaat.. Ik lees de char[] overigens niet uit een InputStream (ik stuur ze wel naar een outputstream). Ik gebruikte eerst String.getBytes() maar daar kwam dus geen UTF8 uit maar iets anders. Het gaat hier overigens om het J2ME platform.
Fijn trouwens om te zien dat in 1.4 die character encoding een eigen class hebben (eindelijk! dat met die string was zo lelijk!)

Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Ik ben met eenzelfde probleem aan het worstelen. Het komt erop neer dat ik nu uit een byte array per onafhankelijke byte wil bepalen wel characterset ik gebruik. Hoe kan ik dat voor elkaar boksen?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Onno
  • Registratie: Juni 1999
  • Niet online
TheOneLLama schreef op zondag 10 maart 2002 @ 15:03:
Ik heb een char[] die ik wil converteren naar UTF-8,
OutputStreamWriter gebruiken met UTF-8 als encoding?
Deddiekoel schreef op donderdag 21 juli 2005 @ 18:39:
Ik ben met eenzelfde probleem aan het worstelen. Het komt erop neer dat ik nu uit een byte array per onafhankelijke byte wil bepalen wel characterset ik gebruik. Hoe kan ik dat voor elkaar boksen?
Niet. Een byte heeft alleen een betekenis in een bepaalde encoding, je kunt niet aan een byte zelf zien wat het voorstelt. Maar hoe stel je dit je sowieso voor? Hoe kun je nou per byte een andere encoding hebben? Je kunt niet eens veronderstellen dat elke byte wel één karakter voorstelt..

[ Voor 4% gewijzigd door Onno op 21-07-2005 18:51 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Waarom schop je zo'n oud topic omhoog als je al een eigen topic hierover hebt lopen? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.