Steffen Flämig: Zeichenketten UTF-8 kodiert ausgeben

Hallo,

ich programmiere gerade meine erste Ajax Seite.
Die Daten werden serverseitig mit Perl generiert und mit json übergeben.

Dabei gibts Probleme sobald Umlaute dabei sind.

Ich nemhe an, es liegt daran, dass die einfache Verwendung eines:
print "{'testText':'Schöne Grüße'}";
den Text nicht -wie wohl von Ajax erwartet- UTF-8 kodiert ausgibt.

Lieg ich da richtig und wenn ja, wie geben ich text mit Perl in der richtigen Kodierung aus?

Gurß

Steffen

Hier mal der auf das Problem reduzierte Quellcode:

Serverseite:
----------------------------------------------
#!C:\Perl\bin\Perl.exe
print "Content-type: text/html\n\n";
print "{'testText':'Schöne Grüße'}";
----------------------------------------------

Klientseite
----------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test</title>
<script type="text/javascript">

var http_request = false;
function makeRequest(query, responseFunction)
{
 http_request = false;
 if (window.XMLHttpRequest)
 { // Mozilla, Safari,...
  http_request = new XMLHttpRequest();
  if (http_request.overrideMimeType)
  {
   http_request.overrideMimeType('text/xml');
  }
 } else
 if (window.ActiveXObject)
  { // IE
   try
   {
    http_request = new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e)
   {
    try
   {
    http_request = new ActiveXObject("Microsoft.XMLHTTP");
   } catch (e) {}
  }
 }
 if (!http_request)
 {
  alert('Giving up :( Cannot create an XMLHTTP instance');
  return false;
 }
 http_request.onreadystatechange = eval(responseFunction);
 http_request.open('POST', 'http://localhost/cgi-bin/ajaxTest_2.pl', true);
 http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 http_request.send(query);
}

function test()
{
 makeRequest("foo", showResult);
}

function showResult()
{
  if (http_request.readyState == 4)
  {

if (http_request.status == 200)
       {
     var list = eval("(" + http_request.responseText + ")");
     alert(list.testText);
   }
 }
}

</script>
<style type="text/css">
</style>
</head>

<body onload="test()">
Test
</body>
</html>
----------------------------------------------

  1. Hallo,

    Lieg ich da richtig und wenn ja, wie geben ich text mit Perl in der richtigen Kodierung aus?

    Nicht ganz richtig. Die utf-8 Kodierung musst Du dem Browser mitteilen.

    Das Prob. ist wohl eher die Geschichte mit URI::Escape. Schau mal hier: http://rolfrost.de/cgi-bin/xmlhttpreq.cgi etwa in der Mitte hab ichs beschrieben.

    roro

    1. Hallo,

      Das Prob. ist wohl eher die Geschichte mit URI::Escape. Schau mal hier: http://rolfrost.de/cgi-bin/xmlhttpreq.cgi etwa in der Mitte hab ichs beschrieben.

      Danke, genau das, was ich suchte :-).

      Gruß
      Steffen

    2. Das Prob. ist wohl eher die Geschichte mit URI::Escape. Schau mal hier: http://rolfrost.de/cgi-bin/xmlhttpreq.cgi etwa in der Mitte hab ichs beschrieben.

      Wozu setzt du hier das Modul ein?
      Da du die Parameter weiter oben mit dem CGI Modul ausliest, werden die Parameter doch sowieso schon umgewandelt.

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. hi,

        Das Prob. ist wohl eher die Geschichte mit URI::Escape. Schau mal hier: http://rolfrost.de/cgi-bin/xmlhttpreq.cgi etwa in der Mitte hab ichs beschrieben.

        Wozu setzt du hier das Modul ein?
        Da du die Parameter weiter oben mit dem CGI Modul ausliest, werden die Parameter doch sowieso schon umgewandelt.

        Jow, das schon. Aber zum Zurücksenden vom Webserver an das XMLHTTP-Objekt brauchts wieder diese Umwandlung:

        [UserAgent XMLHttp - Object] <----------------------------------------------------- [Webserver]
        'gr%FCne%20B%E4ren%20gibt%20es%20nicht' <------------------ uri_escape('grüne Bären gibt es nicht')

        roro

        1. hi,

          Das Prob. ist wohl eher die Geschichte mit URI::Escape. Schau mal hier: http://rolfrost.de/cgi-bin/xmlhttpreq.cgi etwa in der Mitte hab ichs beschrieben.

          Wozu setzt du hier das Modul ein?
          Da du die Parameter weiter oben mit dem CGI Modul ausliest, werden die Parameter doch sowieso schon umgewandelt.

          Jow, das schon. Aber zum Zurücksenden vom Webserver an das XMLHTTP-Objekt brauchts wieder diese Umwandlung:

          seit wann das?
          Ich nutze manchmal CGI::escape() um im HTML Code einen Link der kodiert ist zu erzeugen, aber Text muss doch nicht url kodiert werden?

          Struppi.

          --
          Javascript ist toll (Perl auch!)
  2. Ich nemhe an, es liegt daran, dass die einfache Verwendung eines:
    print "{'testText':'Schöne Grüße'}";
    den Text nicht -wie wohl von Ajax erwartet- UTF-8 kodiert ausgibt.

    Hast du dir schon mal das utf8-Pragma angesehen?

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)