Code archives/Miscellaneous/Unicode/UTF-8 en/decoding
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This is very usefully, if you like to write an irc/icq client, or something else, where you need utf-8 en/decodet strings. ("wünsche" is the german word for "wishes") | |||||
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 |
Comments
| ||
Hey, I asked for help about this one. I created a another entry with the code I created, even it might have not the same speed about this one. Mine version was not about speed, since it was rarely used and one some thing needed. Hence the speed diddent bother me. Otherwice thanks for the code (even I did write my own). |
Code Archives Forum