andi_b: japanischen sonderzeichen in iso-2022-jp umwandeln

moin forum,

ich habe jetzt schon viele seiten und postings über das erstellen von japanischen seiten gelesen - leider war mein fall nicht dabei (oder ich bin zu doof...). ich habe wunderschönstes html (ohne besonderen zeichensatz) in der form:

<p class="bodyText">&#12454;&#12455;&#12502;&#12469;&#12452;&#12488;&#12399;&#20840;&#12390;&#33521;&#35486;&#12391;
&#36939;&#21942;&#12373;&#12428;&#12390;&#12362;&#12426;&#12414;&#12377;&#12364;&#12289;&#26085;&#26412;&#12363;&#12425;&#12398;

//das sind japanische zeichen in soderzeichen dargestellt

nun möchte ich das ganze umwandeln in die form:

<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
<meta http-equiv="content-language" content="jp">
$B%&%'%V%5%$%H$X$h$&$3$=!#$3$3$G$O!"=EMW$J<j=g$K$D$$$FF|K\8l$G4

soweit ich das verstanden habe, sind das unicode-zeichen (?). wie komme ich denn _da_ hin? kann man da ein script schreiben? geht das mit einem programm?

viele grüsse,
andi

  1. Hallo Andi,

    [...]
        <p class="bodyText">&#12454;&#12455;&#12502;&#12469;&#12452;&#12488;&#12399;&#20840;&#12390;&#33521;&#35486;&#12391;
    &#36939;&#21942;&#12373;&#12428;&#12390;&#12362;&#12426;&#12414;&#12377;&#12364;&#12289;&#26085;&#26412;&#12363;&#12425;&#12398;
    [...]
    nun möchte ich das ganze umwandeln in die form:
    [...]

    Hm. Nicht so einfach. Du koenntest dir ein Script schreiben, mit
    PHP oder Perl waere das recht einfach. Du kannst dann die Zeichen
    bei PHP z. B. durch html_entity_decode() jagen, z. B. so:

    $utf8str = html_entitiy_decode("&#12454;&#12455;&#12502;&#12469;&#12452;&#12488;&#12399;&#20840;&#12390;&#33521;&#35486;&#12391;&#36939;&#21942;&#12373;&#12428;&#12390;&#12362;&#12426;&#12414;&#12377;&#12364;&#12289;&#26085;&#26412;&#12363;&#12425;&#12398;",ENT_COMPAT,"UTF-8");

    Das musst du dann noch durch iconv() jagen:

    $iso2022jpstr = iconv("UTF-8","ISO-2022-JP",$utf8str);

    Grüße,
     CK

    --
    Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
    http://wwwtech.de/
    1. hey cristian,
      vielen dank für deine antwort, das klingt nach exakt nach dem, was ich gesucht habe. werde mein resultat posten.

      viele grüsse,
      andi

    2. alter!
      das war ein drama...
      zunächst ging ja das iconv modul nicht (https://forum.selfhtml.org/?t=87524&m=520442)

      nachdem das endlich gelöst war, kam ein php-bug:
      cannot yet handle MBCS in html_entity_decode()
      http://bugs.php.net/bug.php?id=25670

      die lösung dort funktioniert aber leider nicht. zu guterletzt habe ich im php-manual einen kommentar gefunden mit der passenden funktion (drittletzter, ronen at greyzone dot com):
      http://de3.php.net/manual/de/function.utf8-encode.php.

      das ganze ist jetzt so gedacht, dass ich meine japanische datei aus dem word in htm speichere, dann wird via script der ganze <span> mist entfernt, dann wird mit folgender klasse das dokument gewandelt. nun muss man nur noch den header auf:
      <html lang="jp">
      <head>
      <title></title>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
      <meta http-equiv="content-language" content="jp">

      setzen. dann gehts :)

      viele grüsse, andi

      ps: ich weiss, dass die funktion sher unvorteilhaft eingebunden ist, ist mir aber momentan nicht so wichtig ;)

      class ConvertToJapaneseUTF
      {
        var $writer;

      function ConvertToJapaneseUTF()
        {
          global $directoryDelimiter;
          $this->delimitter = $directoryDelimiter;
          $this->writer = & new FileWrite();
        }

      function processFile($myFile)
        {
          $pattern = '=&#[0-9]{4,5};=';

      if(!$fileContent = file($myFile))
          {
            trigger_error('Error reading: '.$myFile, E_USER_ERROR);
          }
          else
          {
            $fileProcessed = false;

      if(!$this->silent)
            {
              echo $myFile."\r\n";
            }
            for($i=0; $i < count($fileContent); ++$i)
            {
              $tmp = $fileContent[$i];
              $fileContent[$i] = preg_replace_callback(
                                              $pattern,
                                              create_function(
                                                              '$match',
                                                              '
                                                              $utf = ConvertToJapaneseUTF::utf8Encode($match[0]);
                                                              $out = iconv("UTF-8", "ISO-2022-JP", $utf);
                                                              echo $match[0].": $utf: $out\r\n";
                                                              return $out;
                                                              '),
                                              $fileContent[$i]);
            if($tmp != $fileContent[$i])
              {
                $fileProcessed = true;
              }
            }
            if($fileProcessed)
            {
              $this->writer->write($myFile, implode($fileContent));
            }
          }
        }

      function utf8Encode ($source) {
          $utf8Str = '';
          $entityArray = explode ("&#", $source);
          $size = count ($entityArray);
          for ($i = 0; $i < $size; $i++) {
            $subStr = $entityArray[$i];
            $nonEntity = strstr ($subStr, ';');
            if ($nonEntity !== false) {
              $unicode = intval (substr ($subStr, 0, (strpos ($subStr, ';') + 1)));
              // determine how many chars are needed to reprsent this unicode char
              if ($unicode < 128) {
                $utf8Substring = chr ($unicode);
              }
              else if ($unicode >= 128 && $unicode < 2048) {
                $binVal = str_pad (decbin ($unicode), 11, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 5);
                $binPart2 = substr ($binVal, 5);

      $char1 = chr (192 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $utf8Substring = $char1 . $char2;
              }
              else if ($unicode >= 2048 && $unicode < 65536) {
                $binVal = str_pad (decbin ($unicode), 16, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 4);
                $binPart2 = substr ($binVal, 4, 6);
                $binPart3 = substr ($binVal, 10);

      $char1 = chr (224 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $char3 = chr (128 + bindec ($binPart3));
                $utf8Substring = $char1 . $char2 . $char3;
              }
              else {
                $binVal = str_pad (decbin ($unicode), 21, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 3);
                $binPart2 = substr ($binVal, 3, 6);
                $binPart3 = substr ($binVal, 9, 6);
                $binPart4 = substr ($binVal, 15);

      $char1 = chr (240 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $char3 = chr (128 + bindec ($binPart3));
                $char4 = chr (128 + bindec ($binPart4));
                $utf8Substring = $char1 . $char2 . $char3 . $char4;
              }

      if (strlen ($nonEntity) > 1)
              $nonEntity = substr ($nonEntity, 1); // chop the first char (';')
              else
              $nonEntity = '';

      $utf8Str .= $utf8Substring . $nonEntity;
            }
            else {
              $utf8Str .= $subStr;
            }
          }
          return $utf8Str;
        }
      }

      1. noch ein (für mich wichtiger) nachtrag:

        die auslieferung über den apache funktioniert standardmässig nicht, weil der den in dem fall falschen charset nimmt.

        deswegen: dateien umbenennen in datei.html.jis und im apache das modul 'mod_negotiation' laden. dann werden diese dateien auch über den link datei.html ordentlich ausgeliefert.

        andi