UTF8 En/Decodierung

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Lunatix

Betreff: UTF8 En/Decodierung

BeitragDo, Dez 27, 2007 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit dem folgenden Code kann man UTF-8 Strings Encodieren oder Decodieren. Zum Bleistift sehr nützlich, wenn man ICQ/IRC Clienten programmiert. Einfach die Nachricht als ein Byte Arrayabspeichern und der funktion "TUTF8.Utf8ToString" Übergeben.
Ebenso, wenn man eine Nachricht versenden will, einfach die Einzelnen Zeichen der funktion "TUTF8.fromInt" übergeben, zurück kommt ein Byte Array mit den Entsprechenden Bytes. diese müssen in dieser Reihenfolge versendet werden. Je nach Zeichen ist ein UTF-8 Codiertes Zeichen 1-6 Bytes lang.


Code: [AUSKLAPPEN]
SuperStrict
Framework brl.blitz
Import brl.system


Local text:String = "wünsche"
Local array:Byte[text.length]

For Local i:Int = 0 Until text.length
   array[i] = text[i]
Next

Local dec_text:String = TUTF8.utf8ToString(array)

Local utf8_text:String
For Local i:Int = 0 Until dec_text.length
   Local res:Byte[] = TUTF8.fromInt(dec_text[i])
   For Local b:Int = EachIn res
      utf8_text:+Chr(b)
   Next
Next


Notify text
Notify dec_text
Notify utf8_text

Type TUTF8
   Function getlength:Int(i:Int)
      Select True
         Case i<$7f                  Return 1
         Case i=>$7f And i<$7ff         Return 2
         Case i=>$7ff And i<$ffff      Return 3
         Case i=>$ffff And i<$1fffff      Return 4
         Case i=>$1fffff And i<$3ffffff   Return 5
         Case i=>$3ffffff And i<$7ffffff   Return 6
      End Select
   End Function
   
   Function fromInt:Byte[](code:Int)
      Local value:Byte[]
      Local length:Int = getlength(code)
      value = New Byte[length]
      Select length
         Case 1
            value[0] = code
         Case 2
            value[0] = 192+(code/64)
            value[1] = 128+(code Mod 64)
         Case 3
            value[0] = 224+(code/4096)
            value[1] = 128+((code/64) Mod 64)
            value[2] = 128+(code Mod 64)
         Case 4
            value[0] = 240+(code/262144)
            value[1] = 128+((code/4096) Mod 64)
            value[2] = 128+((code/64) Mod 64)
            value[3] = 128+(code Mod 64)
         Case 5
            value[0] = 248+(code/16777216)
            value[1] = 128+((code/262144) Mod 64)
            value[2] = 128+((code/4096) Mod 64)
            value[3] = 128+((code/64) Mod 64)
            value[4] = 128+(code Mod 64)
         Case 6
            value[0] = 252+(code/1073741824)
            value[1] = 128+((code/16777216) Mod 64)
            value[2] = 128+((code/262144) Mod 64)
            value[3] = 128+((code/4096) Mod 64)
            value[4] = 128+((code/64) Mod 64)
            value[5] = 128+(code Mod 64)
      End Select
      Return value
   End Function 
   
   Function utf8ToString:String(_data:Byte[])
      Local length:Int,str:String,b:Int,x:Int
      For Local i:Int = 0 Until _data.length
         b=_data[i]
         length = getlength(b)
         If (i+length-1)>_data.length Exit
         Select length
            Case 1
               x=b
            Case 2
               x=( ((b-192)*64) + (_data[i+1]-128) )
            Case 3
               x=( ((b-224)*4096) + ((_data[i+1]-128)*64) + (_data[i+2]-128) )
            Case 4
               x=( ((b-240)*262144) + ((_data[i+1]-128)*4096) + ((_data[i+2]-128)*64) + (_data[i+3]-128))
            Case 5
               x=( ((b-248)*16777216) + ((_data[i+1]-128)*262144) + ((_data[i+2]-128)*4096) + ((_data[i+3]-128)*64) + (_data[i+4]-128))
            Case 6
               x=( ((b-252)*1073741824) + ((_data[i+1]-128)*16777216) + ((_data[i+2]-128)*262144) + ((_data[i+3]-128)*4096) + ((_data[i+4]-128)*64) + (_data[i+5]-128))
         End Select
         str:+Chr(x)
         i:+(length-1)
      Next
      Return str
   End Function 
   
End Type
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...
 

#Reaper

Newsposter

BeitragDo, Dez 27, 2007 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön, nur leider im falschem Forum Wink

Aber sowas kann ich auch gut gebrauchen, danke Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

d-bug

BeitragDo, Dez 27, 2007 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.


d-bug

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group