Avatar billede plindstrup Nybegynder
08. august 2008 - 20:39 Der er 16 kommentarer og
2 løsninger

UTF-8 problemer

Hej

Jeg har en side hvor jeg har en form. Den sender noget tekst til en database. Men den vil ikke sende æ, ø og å. Feltet bliver bare blankt, og intet tilføjes databasen.

Men hvis jeg skriver koden for æ, ø eller å og sender, så vil den godt. Og så retunere den feltet med et æ, ø eller å.

Hjemmesiden vil godt vise æ, ø og å normalt. Ligesom den lang fil jeg har lavet, også fint smider æ, ø og å ind på siden når det hentes.

Hvis jeg indsætter æ, ø eller å direkte i det pågældende felt i tabellen i databasen, så viser den det også fint.

Det er som om den bare ikke vil skrive de 3 bogstaver til databasen, af en eller anden underlig grund.

Siden som jeg har formen på, har følgende kode:

<?php
include("../include/config.php");
include_once("../include/functions/import.php");
verify_login_admin();
       
       
if($_REQUEST['update'] == "success")
{
    $message = "Video Successfully Edited";
    Stemplate::assign('message',$message);
    STemplate::display("administrator/show_message.tpl");
}
       
if($_REQUEST['edit_video'])
{
    $title = htmlentities(strip_tags($_REQUEST[title]),ENT_QUOTES,'UTF-8');
    $description = htmlentities(strip_tags($_REQUEST[description]),ENT_QUOTES,'UTF-8');
    $tags = htmlentities(strip_tags($_REQUEST[tags]),ENT_QUOTES,'UTF-8');
    $categories = intval($_REQUEST[categories]);   
    $featured = intval($_REQUEST[featured]);   
    $active = intval($_REQUEST[active]);
    $mature = intval($_REQUEST[mature]);
    $VIDEOID = intval($_REQUEST[VIDEOID]);
   
    $query = "update videos set
    title = '".mysql_real_escape_string($title)."',
    description = '".mysql_real_escape_string($description)."',
    tags = '".mysql_real_escape_string($tags)."',
    categories = '".mysql_real_escape_string($categories)."',
    featured = '".mysql_real_escape_string($featured)."',
    active = '".mysql_real_escape_string($active)."',
    mature = '".mysql_real_escape_string($mature)."'
    where VIDEOID='".mysql_real_escape_string($VIDEOID)."'";
    $conn->execute($query);
    header("Location: listvideosedit.php?update=success&VIDEOID=$VIDEOID");
}

if($_REQUEST['VIDEOID']!="")
{
$VIDEOID = intval($_REQUEST[VIDEOID]);
$query = $conn->execute("select * from videos where VIDEOID='".mysql_real_escape_string($VIDEOID)."' limit 1");
$video = $query->getrows();
Stemplate::assign('video', $video[0]);
}

Stemplate::assign('error',$error);
STemplate::display("administrator/listvideosedit.tpl");
?>

KAN problemet være i nogle af de filer jeg includer? I så fald, hvad skal jeg være opmærksom på kan være forkert?
Hvis det er et must at i kan se indholdet af de filer der includes, så sig til. Så smider jeg dem som kommentar, da det vil fylde alt alt for meget at smide ALT i selve spørgsmålet her :-)
Avatar billede jakobdo Ekspert
08. august 2008 - 21:16 #1
Husker du din side skal bruger character encoding UTF-8 ?
Og husker du også dit tegnsæt i databasen skal være UTF-8 ?
Avatar billede janpolsen Nybegynder
08. august 2008 - 21:40 #2
... og husker du at det også kan have noget at sige, om du gemmer din kode i UTF-8?
Avatar billede plindstrup Nybegynder
08. august 2008 - 21:41 #3
Hvordan sætter jeg siden til at bruge det?
I de sprogfiler der er, har jeg sat den til det. Men jeg har ikke rørt noget på de øvrige sider som vises til slutbrugerne.

Men siden viser dem uden problemer. Men admindelen gider bare ikke at sende æ, ø og å til databasen.

Skal jeg sætte ALLE adminsider til at bruge UTF-8? I så fald, hvordan gøres det?

Jeg har sat databasen til både unicode UTF-8 og UTF-8 danish. Så databasen vil gerne lagre æ, ø og å. Og hvis jeg skriver dem manuelt i databasen, via phpMyAdmin, så bliver de også vist korrekt på siden.
Avatar billede plindstrup Nybegynder
08. august 2008 - 21:43 #4
janpolsen > Gemmer i UTF-8? Er ikke sikker på at jeg forstår
Avatar billede jakobdo Ekspert
08. august 2008 - 21:51 #5
I html: charset="utf-8"
Avatar billede janpolsen Nybegynder
08. august 2008 - 21:57 #6
En meget udbredt måde at styre det på er, at have én header-fil, som bliver inkluderet i starten af samtlige sider. I den headerfil angiver du din encoding via HTML meta tags.

Det fleste editors i dag kan gemme filer i almindelig ASCII (DOS- eller UNIX-format som angiver hvilke type linjeskift der er brugt samt i UTF-8/Unicode. Det er et spørgsmål om hvordan filen rent faktisk bliver gemt. UTF-8 bruger et par bytes hver gang der er et "specielt" tegn og Unicode bruger 2 bytes for samtlige tegn. Derudover er der en et par ekstra "tegn" i starten af filen.

Alt sammen noget du ikke ligger mærke til i dagligdagen i din editor, men noget som har betydning for ens kode når man eksempelvis bruger æ, ø og å.
Avatar billede plindstrup Nybegynder
08. august 2008 - 22:31 #7
Jeg har definitvit konstateret at fejlen må være i admindelen af siden. For når jeg bruger frontend, altså det som brugerne ser, så gider den godt. Så det er nok bare det at jeg ikke har tilføjet UTF-8 i HTML koden.

Men har ikke styr på hvad der bliver brugt hvor og hvordan. Det er et købt script, som er programmeret andensteds. Selv har jeg ikke mere forstand på det, end at jeg kan overkomme at rette småting.

Burde det være muligt at løse, ved at inkludere noget HTML der angiver charsettet i en af de php-filer den inkludere på alle sider?

Den inkludere import.php, som blot inkludere 4 yderligere php-filer. Er det muligt at angive charsettet i denne import.php?

Koden i import.php ser således ud

<?php
include("main.php");
include("msgs.php");
include("vseries.php");
include("xml.php");
?>
Avatar billede jakobdo Ekspert
08. august 2008 - 22:46 #8
Du skal finde den fil, hvor du har noget ala:

<html>
<head>
Avatar billede plindstrup Nybegynder
08. august 2008 - 23:02 #9
Den filer som er "hovedfilen" i admindelen, har jeg ENDELIG fundet HTML koden til :-) (var gemt i en tpl fil, hvad så end det er)

Koden er som følger

<HTML>
<HEAD>
<TITLE>{$site_name} ACP</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
{literal}
<SCRIPT>
<!--
if(top!=self)
top.location.href=self.location.href;
//--->
</SCRIPT>
{/literal}
<link href="{$cssurl}/administrator.css" rel="stylesheet" type="text/css">
{literal}
<script language="javascript" type="text/javascript">
function calcHeight()
{
  //find the height of the internal page
  var the_height=
    document.getElementById('body').contentWindow.
      document.body.scrollHeight;

  //change the height of the iframe
  document.getElementById('body').height=
      the_height;
}
</script>
{/literal}
</HEAD>
<body topmargin="0" bgcolor="#444444">

<center>
<table width="1004px" cellpadding="0" cellspacing="0">
<tr>
    <td bgcolor="#333333" width="2px"></td>
    <td>
   
<table width="1000px" cellpadding="0" cellspacing="0">
<tr>
    <td bgcolor="#ffffff">
    <img src="{$imageurl}/administrator/acplogo.png" width="1000" height="150" border="0" usemap="#Map">
    </td>
</tr>
</table>

<table width="1000px" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
    <td>
   
    <table width="1000px" cellpadding="0" cellspacing="0">
    <tr>
        <td width="5px">&nbsp;</td>
        <td width="200px" valign="top">
            <div style="padding-top:5px;"></div>
            {include file="administrator/navigation.tpl"}
            <div style="padding-top:5px;"></div>
        </td>
        <td width="790px" valign="top">
            <iframe name="body" onLoad="calcHeight();" scrolling="no" width="100%"  id="body" src="{$adminurl}/{$defaulthome}" frameborder="0" allowtransparency="true"></iframe>
        </td>
        <td width="5px">&nbsp;</td>
    </tr>
    </table>
   
    </td>
</tr>
<tr>
    <td bgcolor="#333333">
        <div style="vertical-align:middle; font-weight:bold; padding-top:15px; padding-bottom:15px; padding-left:10px;">Copyright &copy; 2008 <a href="http://www.videowatchpro.com">VideoWatch Professional</a>. All Rights Reserved.</div>
    </td>
</tr>
</table>

    </td>
    <td bgcolor="#333333" width="2px"></td>
</tr>
</table>
</center>


<map name="Map"><area shape="rect" coords="786,21,875,47" href="{$adminurl}/control.php"><area shape="rect" coords="892,22,984,47" href="{$adminurl}/logout.php"></map></body>
</HTML>

Og filen som er selve den side hvor jeg retter videoen, der er koden som følger:

<html>
<head>
<title>{$site_name}</title>
<mets http-equiv=Content-Type content="text/html; charset=utf-8">
<link href="{$cssurl}/administrator.css" type=text/css rel=stylesheet>
{literal}
<script type="text/javascript">
  function checkForm() {
  title = document.getElementById("title").value;
  description = document.getElementById("description").value;
 
  if (title == "") {
  hideAllErrors();
document.getElementById("titleError").style.display = "inline";
document.getElementById("title").select();
document.getElementById("title").focus();
  return false;
  } else if (description == "") {
hideAllErrors();
document.getElementById("descriptionError").style.display = "inline";
document.getElementById("description").select();
document.getElementById("description").focus();
  return false;
  }
  return true;
  }

  function hideAllErrors() {
document.getElementById("titleError").style.display = "none"
document.getElementById("descriptionError").style.display = "none"
  }

</script>

<style>
  .error {
  font-family: Tahoma;
font-size: 8pt;
  color: red;
background-color: "#FFFF99";
font-weight: bold;
  margin-left: 5px;
  display:none;
  }
</style>
{/literal}
</head>
<body>
<br>

<table width="90%" align="center" cellpadding="5" cellspacing="5">
<tr>
    <td>
        <h3>Edit Video</h3>
    </td>
</tr>
<tr>
    <td colspan="2" height="1" bgcolor="#dfdfdf"></td>
</tr>
</table>

<form onSubmit="return checkForm();" action="listvideosedit.php" method="POST" enctype="multipart/form-data" name="form">
<table width="90%" align="center" cellpadding="5" cellspacing="5">
<tr>
    <td width="40%"><b>Title</b></td>
    <td>
        <input type="text" id="title" name="title" value='{$video.title}' size="40"><br>
        <div align="center" class="error" id="titleError">ERROR: Please enter a video title.</div>
    </td>
</tr>
<tr>
    <td width="40%" valign="top"><b>Description</b></td>
    <td>
        <textarea type=text value="{$video.description}" id=description name="description" rows=3 cols=40>{$video.description}</textarea><br>
        <div class=error id=descriptionError>ERROR: Please enter the video description.<br></div>
    </td>
</tr>
<tr>
    <td width="40%" valign="top"><b>Tags</b></td>
    <td>
        <textarea type=text value="{$video.tags}" id="tags" name="tags" rows=3 cols=40>{$video.tags}</textarea><br>
    </td>
</tr>
<tr>
    <td width="40%" valign="top"><b>Categories</b></td>
    <td>
                <select id="categories" name="categories">
                {insert name=get_video_categories assign=listvideocategories}
                {section name=o loop=$listvideocategories}
                <option value="{$listvideocategories[o].CATID}" {if $video.categories eq $listvideocategories[o].CATID}selected{/if}>{$listvideocategories[o].name}</option>
                {/section}
                </select>
        <br>
    </td>
</tr>
<tr>
    <td width="40%" valign="top"><b>Featured</b></td>
    <td>
        <input type="radio" id="featured" name="featured" value="0" {if $video.featured eq "0"}checked{/if}>No
        <input type="radio" id="featured" name="featured" value="1" {if $video.featured eq "1"}checked{/if}>Yes
    </td>
</tr>
<tr>
    <td width="40%" valign="top"><b>Active</b></td>
    <td>
        <input type="radio" id="active" name="active" value="0" {if $video.active eq "0"}checked{/if}>No
        <input type="radio" id="active" name="active" value="1" {if $video.active eq "1"}checked{/if}>Yes
    </td>
</tr>
<tr>
    <td width="40%" valign="top"><b>Mature</b></td>
    <td>
        <input type="radio" id="mature" name="mature" value="0" {if $video.mature eq "0"}checked{/if}>No
        <input type="radio" id="mature" name="mature" value="1" {if $video.mature eq "1"}checked{/if}>Yes
    </td>
</tr>

<tr>
        <td colspan="2" align='center'>
        <input type="hidden" id="VIDEOID" name="VIDEOID" value='{$video.VIDEOID}' size="40">
        <input type='submit' name='edit_video' value='Submit' class="send-btn"></td>
</tr>
<tr>
        <td colspan="2">&nbsp;</td>
</tr>
</table>
</form>

</body>
</head>
</html>

Så det ser altså ud til at UTF-8 er inkluderet. Jeg er helt på bar bund nu.
Avatar billede jakobdo Ekspert
09. august 2008 - 10:14 #10
Ja, den ser nu fin fin ud. :o(
Avatar billede plindstrup Nybegynder
09. august 2008 - 11:45 #11
Nu har jeg skrevet til dem der har programmeret scriptet, og de vil vende tilbage i næste uge.

Men det er godt nok lidt mystisk, for alt ser ud til at passe.

Når jeg skriver æ, ø og å i boksen og trykker send, så retunere den at videoen er opdateret med succes. Men feltet hvor jeg har brugt æ, ø og å er nu tomt - og intet er sendt til databasen.

Jeg kan godt skrive koden for æ, ø og å. Når jeg så trykker send, så returnere den også at den er opdateret med succes, men nu står der så æ, ø eller å istedet for koden for bogstavet.

Den viser også fint æ, ø og å i editboksen, når jeg har indsat æ, ø eller å direkte i databasen. Men straks jeg opdatere videoen, så ryger æ, ø og å væk.

Men jeg må vel vente og se hvad dem bag scriptet finder ud af :-)
Avatar billede plindstrup Nybegynder
09. august 2008 - 11:46 #12
Jeg poster self løsningen fra dem her, hvis nogen andre nogensinde skulle stå i sådan en bizar situation :-)
Avatar billede plindstrup Nybegynder
09. august 2008 - 12:03 #13
Okay, nu sad jeg selv og kiggede lidt på det.

I FireFox fandt jeg ud af at den havde en henvisningsurl. Index.html.
Denne fil var ganske tom, så jeg satte følgende ind:

<HTML>
<HEAD>
<TITLE>{$site_name} ACP</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
</HTML>

Dette har vist løst problemet. Jeg er ikke den store ekspert. Men det var åbenbart det der skulle til.
Men nu står der godt nok 2 UTF-8 når man ser sideoplysninger for siden i FireFox. Men problem solved.

Jeg vil gerne give janpolsen og jakobdo lidt point for deres hjælp, for uden forklaringen om charset osv, havde jeg nok ikke kigget på det fra denne vinkel. Så hvis i smider et svar.
Avatar billede jakobdo Ekspert
09. august 2008 - 18:47 #14
Svar!
Avatar billede janpolsen Nybegynder
09. august 2008 - 21:23 #15
Så lyder der et tak herfra :)
Avatar billede jakobdo Ekspert
09. august 2008 - 21:47 #16
Takker for point.
Avatar billede janpolsen Nybegynder
09. august 2008 - 22:33 #17
Jeg står pudsigt nok med en lignende situation. Jeg har UTF-8 i databasen (helt ned på tabel-niveau), i selve kildekoden, i min header og alligevel får jeg ikke danske tegn på skærmen. Kun ved hjælp af PHPs utf8-encode() virker det :(.

Jeg takker også for point og ser frem til den tid hvor alt er unicode :)
Avatar billede plindstrup Nybegynder
09. august 2008 - 23:01 #18
Jeg forstår slet ikke hvorfor der er så mange forskellige. Er det så svært at lave et eneste charset? :-) Måske er jeg naiv, og måske er kineserne skyld i det - men alligevel.

Jeg kan forresten se at dem der har lavet scriptet har lavet sprogfilerne med PHP's encode. Det er belastende at det skal være så besværligt (for mig er alt besværligt, hvis det kræver at man skal tænke)
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