japanischen sonderzeichen in iso-2022-jp umwandeln
andi_b
- html
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">ウェブサイトは全て英語で
運営されておりますが、日本からの
//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
Hallo Andi,
[...]
<p class="bodyText">ウェブサイトは全て英語で
運営されておりますが、日本からの
[...]
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("ウェブサイトは全て英語で運営されておりますが、日本からの",ENT_COMPAT,"UTF-8");
Das musst du dann noch durch iconv() jagen:
$iso2022jpstr = iconv("UTF-8","ISO-2022-JP",$utf8str);
Grüße,
CK
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
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;
}
}
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