Avatar billede learner Praktikant
03. december 2005 - 19:50 Der er 30 kommentarer og
1 løsning

Konvertere text til unicode streng

Hej, jeg skal have en text streng ændret til unicode streng(feks 'dfsfaf' bliver til '006400660073006600610066')

Findes der en funktion i PHP som kan det?

Jeg skal bruge det, for jeg skal sende SMS beskeder i Polen og der har de underlige tegn. Jeg bruger clickatell og der kan man sende unicode. Det vil jeg så prøve at lege lidt med.

På forhånd tak.
Michael
Avatar billede Slettet bruger
04. december 2005 - 08:28 #1
Nu er unicode noget meget bredt men hvis du kan klare dig med UTF-8 så har PHP følgende : http://dk2.php.net/manual/en/function.utf8-encode.php
Avatar billede learner Praktikant
04. december 2005 - 11:11 #2
Jeg har prøvet utf8_encode og 'dfsfaf' bliver ikke '006400660073006600610066'
Desværre

Jeg jeg tror jeg leder efter en funktion som kan
lave_text_om_til_mbstring_unicode('dfsfaf')
Avatar billede learner Praktikant
04. december 2005 - 11:13 #3
Man kan vel teste den sådan:
if (funktion('dfsfaf')=='006400660073006600610066'){
  echo "YES, DET VIRKER!";
}
Avatar billede learner Praktikant
04. december 2005 - 14:45 #4
Nogen der har et forslag???
Avatar billede learner Praktikant
04. december 2005 - 15:31 #5
Hvad betyder encode / decode ?
Skal jeg have decoded eller encoded når jeg vil fra bogstaver til kode/numre?

Jeg har virkelig  brug for hjælp med det her, er der ik nogen der vil hjælpe?
Avatar billede learner Praktikant
04. december 2005 - 15:39 #6
Er det iconv() jeg skal bruge? Hvis ja, hvordan?
Avatar billede ajenbo Nybegynder
06. december 2005 - 19:00 #7
hvor fra ved du at det bliver 006400660073006600610066, måske er det utf-8 læst som octal...
hvad blev dfsfaf til da du brugte utf8_encode?

octal_til_hex(006400660073006600610066) = 6806C07606C06206
Avatar billede learner Praktikant
06. december 2005 - 19:19 #8
Clickatell.com har en converter som jeg indsatte dfsfafhdfhjushu i og resultatet blev 006400660073006600610066.

echo utf8_encode('dfsfafhdfhjushu') // udskriver 'dfsfafhdfhjushu'

:o)
Avatar billede learner Praktikant
06. december 2005 - 19:20 #9
her er lidt jeg har eksperimenteret med:
echo sprintf("%b",_("dfsfafhdfhjushu"))."<br>";
echo sprintf("%o",_("dfsfafhdfhjushu"))."<br>";
echo sprintf("%x",_("dfsfafhdfhjushu"))."<br>";
echo sprintf("%X",_("dfsfafhdfhjushu"))."<br>";
echo sprintf("%s",_("dfsfafhdfhjushu"))."<br>";
echo sprintf("%e",_("dfsfafhdfhjushu"))."<br>";
echo sprintf("%u",_("dfsfafhdfhjushu"))."<br>";
echo sprintf("%f",_("dfsfafhdfhjushu"))."<br>";
echo base64_encode(_("dfsfafhdfhjushu"))."<br>";
echo base64_decode(_("dfsfafhdfhjushu"))."<br>";
echo htmlspecialchars(_("dfsfafhdfhjushu"))."<br>";
echo htmlentities (_("dfsfafhdfhjushu"))."<br>";
echo urlencode(_("dfsfafhdfhjushu"))."<br>";
echo utf8_encode(_("dfsfafhdfhjushu"))."<br>";
echo utf8_decode(_("dfsfafhdfhjushu"))."<br>";
echo html_entity_decode(_("dfsfafhdfhjushu"))."<br>";

Resultat:
0
0
0
0
dfsfafhdfhjushu
0.00000e-1
0
0,000000
ZGZzZmFmaGRmaGp1c2h1
u?~&#60571;
dfsfafhdfhjushu
dfsfafhdfhjushu
dfsfafhdfhjushu
dfsfafhdfhjushu
dfsfafhdfhjushu
dfsfafhdfhjushu
Avatar billede learner Praktikant
06. december 2005 - 19:23 #10
Æhh,
u?~&#60571;
vises forkert her

skulle være
u?~<firkant><firkant>
Avatar billede pidgeot Nybegynder
06. december 2005 - 19:26 #11
Den converter der ligger på Clickatell har omdannet det til decimaltal. Derfor virker det du vil ikke umiddelbart.

Kan du prøve at omdanne tegnet &#12354; og se hvad du får tilbage? På den måde kan det være vi kan komme lidt nærmere en løsning :)
Avatar billede pidgeot Nybegynder
06. december 2005 - 19:30 #12
Gah - unicode virker selvfølgelig ikke her...

Gå et smut ind på http://birdiesoft.dk/unicodetest.htm og konverter det tegn :)
Avatar billede learner Praktikant
06. december 2005 - 19:32 #13
Tusind tak :o)
Jeps jeg har prøvet nu og får '3042' tilbage
Avatar billede learner Praktikant
06. december 2005 - 19:33 #14
øhh, nej vent. jeg indsatte det der ikke virkede :o)
skal jeg indsætte firkanten?
Avatar billede learner Praktikant
06. december 2005 - 19:34 #15
firkanten giver også '3042' tilbage :o)
Avatar billede pidgeot Nybegynder
06. december 2005 - 19:38 #16
Godt så - nu ved jeg i det mindste med sikkerhed hvordan formatet er (fire hexadecimale tegn der repræsenterer Unicode værdi) - med andre ord, eftersom jeg ved hvordan det skal læses, bør det også kunne lade sig gøre at skrive det :)

Jeg skal lige have lidt tid til at kigge nærmere på det - jeg vender tilbage lidt senere.
Avatar billede learner Praktikant
06. december 2005 - 19:46 #17
Tuuuuuusind tak :o) :o)
Avatar billede pidgeot Nybegynder
06. december 2005 - 19:54 #18
Hvis du selv vil gå i gang, kan du læse http://en.wikipedia.org/wiki/UTF-8 og finde ud af hvordan du omdanner en UTF-8 værdi til Unicode (som du skal bruge) - når du har gjort dette, skal du blot udskrive værdien som hex. Det kommer til at vare lidt tid før jeg kan lave den funktion færdig, omend jeg har fået dannet mig et overblik over den.
Avatar billede learner Praktikant
06. december 2005 - 19:55 #19
Jeg læser lige på det og ser om jeg kan finde ud af det. Jeg skriver straks hvis jeg løser det selv. Tusind tak
Avatar billede learner Praktikant
06. december 2005 - 19:57 #20
Et hurtigt spm :o)

du skriver: ... når du har gjort dette, skal du blot udskrive værdien som hex.

Men hvordan gør man det?
Avatar billede pidgeot Nybegynder
06. december 2005 - 20:07 #21
Det gør du eks. med sprintf("%x", $værdi) eller sprintf("%X", $værdi). Hvilken af de to du skal bruge afhænger af om den converter returnerer store eller små bogstaver (brug %x ved små, %X ved store). Du kan teste hvis du går ind på den test-URL jeg gav dig før og prøver at konveretere det tegn jeg lige har sat ind på anden linie (resultatet skulle blive 304A).

Det afhænger dog lidt af hvordan du vælger at lave din funktion - hvis du vælger at få din Unicode bygget op som en binær streng, kan du bruge bin2hex(), evt. i kombination med strtoupper() (om nødvendigt).

Du må egentlig gerne lige skrive hvad den bruger, så jeg ved det hvis jeg når at lave funktionen inden dig :)

I øvrigt: du bør ignorere den sidste gruppe der er beskrevet inde på Wikipedia, da du alligevel ikke vil kunne repræsentere den korrekt i det format outputtet skal have.
Avatar billede learner Praktikant
06. december 2005 - 20:12 #22
Den returnerer 304A som du skriver :o)
Avatar billede learner Praktikant
06. december 2005 - 20:13 #23
Og jeg læser alt jeg kan, men forstår kun noget af det. Jeg er super glad for din hjælp.
Avatar billede learner Praktikant
06. december 2005 - 21:01 #24
Jeg giver op, jeg fatter det bare ikke. Ser meget frem til din hjælp.
Avatar billede pidgeot Nybegynder
06. december 2005 - 21:34 #25
Jeg kan da hilse at sige at jeg gerne skulle have en løsning lidt senere på aftenen - der er lige en lille fejl jeg skal have rettet, men det meste virker.

Lige nu er jeg dog nødt til at holde en lille pause, da jeg har et par ting jeg gerne skulle nå inden skolen i morgen - men regn med noget indenfor ca. en time.
Avatar billede learner Praktikant
06. december 2005 - 22:01 #26
:o) Glæder mig :o)
Du skulle bare vide hvor mange timer jeg har brugt på det. Uden held.
Avatar billede pidgeot Nybegynder
06. december 2005 - 22:26 #27
Så skulle den være der - her kommer et komplet PHP script der konverterer til det format du skal bruge, inkl. en formular med et input-felt, som du kan bruge til at teste med:

<? header("Content-Type: text/html; charset=UTF-8"); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
<?
function utf8tounicode_hex($str)
{
  $result="";
  $pos=0;
  while ($pos<strlen($str))
  {
    $b=ord($str[$pos]);
    if ($b<=127)    //U+0000-U+007F - Alm. ASCII
    {
      $result.=tohex_fixedlength($b);
      $pos++;
      continue;
    }
    if ($b>=192 && $b<=223)    //U+0080-U+07FF - 00000zzz zxxxxxxx <- 110zzzzx 10xxxxxx
    {
      $b1=ord($str[$pos+1]);
      //echo('$b=' . $b . ', $b1=' . $b1 . '<br>');
      $z=($b % 32) >> 1;
      if ($b1<128 || $b1>192 || $z==0)
        die('Ugyldig UTF-8 ved position ' . $pos . ' (' . "$b, $b1" . ')');
      $x=($b % 2 ) * 64 + $b1 % 64;
      $val=$z*128+$x;
      //echo('$z=' . $z . ', $x=' . $x . ', $val=' . $val . '<br>');
      $result.=tohex_fixedlength($val);
      $pos+=2;
      continue;
    }
    if ($b>=224 && $b<=239)    //U+0800-U+FFFF - zzzzzxxx xxxxxxxx <- 1110zzzz 10zxxxxx 10xxxxxx
    {
      $b1=ord($str[$pos+1]);
      $b2=ord($str[$pos+2]);
      //echo('$b=' . $b . ', $b1=' . $b1 . ', $b2=' . $b2 . '<br>');
      $z=$b % 16 * 2 + (($b1 % 32) >> 5);
      if ($b1<128 || $b1>192 || $b2<128 || $b2>192 || $z==0)
        die('Ugyldig UTF-8 ved position ' . $pos . ' (' . "$b, $b1, $b2" . ')');
      $x=$b1 % 32 * 64 + $b2 % 64;
      $val=$z*2048+$x;
      //echo('$z=' . $z . ', $x=' . $x . ', $val=' . $val . '<br>');
      $result.=tohex_fixedlength($val);
      $pos+=3;
      continue;
    }
  }
  return $result;
}

function tohex_fixedlength($val, $length=4, $useupper=true)
{
  $format='%x';
  if ($useupper)
    $format='%X';
  $result=sprintf($format,$val);
  while (strlen($result)<$length)
    $result='0' . $result;
  return $result;
}

echo $_POST['str'] . ' = ' . utf8tounicode_hex($_POST['str']);
?><br>
  <form method="post">
      <input type="text" name="str">
      <input type="submit" value="Konverter">
    </form>
  </body>
</html>

Der kan muligvis optimeres lidt hist og her, men det vigtigste er vel at det virker :)

For at bruge funktionen, sender du blot en gyldig UTF-8 streng til den. Det kræver enten at du encoder den (det skulle utf8_encode kunne klare), eller at den side du bruger den på er sat til at bruge UTF-8 - det kan du fortælle browseren ved at smide den øverste linie ind før noget output, såfremt din server ikke allerede er sat op til dette.
Avatar billede pidgeot Nybegynder
06. december 2005 - 22:27 #28
Og for at der ikke skal mangle noget, så kan du prøve den af på http://birdiesoft.dk/utf8convert.php ;)
Avatar billede learner Praktikant
06. december 2005 - 22:33 #29
Det var da utroligt overvældende :o)
Tusind tak :o)
Du skal have noget. Et eller andet.
Nøj hvor er du flink.
Kan jeg ikke hjælpe dig tilbage? Er der noget du står og mangler?
Avatar billede pidgeot Nybegynder
06. december 2005 - 22:39 #30
Nej tak - 198 point er rigeligt ;)

Desuden er det her jo også værdifuld øvelse for mig - nu har jeg jo lært lidt om at afkode UTF-8 ved at lave det her, det kan jeg sikkert bruge på et senere tidspunkt :)
Avatar billede learner Praktikant
06. december 2005 - 22:48 #31
Du har ihvertfald fortjent en julehilsen. Er du ikke flink at sende din adresse til mail(a)rejseagenten.dk så jeg kan sende dig noget. Det vil jeg meget gerne, for du aner ikke hvor lettet jeg er. Jeg har det bare så svært ved at blive gode venner med unicode og utf-8 :o)

Flot kode
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester