[PHP-users 34868] Re: JISで文字列の置換を行いたい。

菊澤 正明 kikuzawa @ cyber-coo.com
2009年 12月 9日 (水) 15:59:16 JST


菊澤と申します。

ISO 2022では、文字集合の切り替え(ASCII→JIS X 0208/JIS X 0208→ASCII)で、
エスケープシーケンスが入りますので、文字列の編集には、向いていません。
一旦、UTF-8なりEUCに変換してやるのが、無難かと思われます。

示されたコードの出力では、

(1)萩山(2)(1)さん、こんにちは。(2)

となっていました。

(1)は、エスケープシーケンス(ASCII→JIS X 0208)、ESC ( B (1b 24 42)
(2)は、エスケープシーケンス(JIS X 0208→ASCII)、ESC $ B (1b 28 42)

EmEditorでは読めましたが、(2)(1)と連続する場合、読めないエディタも
あるかもしれません。

コードに、文字列をダンプする関数を入れてみましたので、
エスケープシーケンスの付き具合を確認できます。

<?php // -*- coding: utf-8 -*-

function string_dump($str)
{
  $chars = array();
  $codes = array();
  for($i = 0; $i < strlen($str); $i++) {
    $char = substr($str, $i, 1);
    $codes[] = ord($char);
    $chars[] = $char;
  }
  echo "<table cellpadding='2' cellspacing='0' border='1'>";

  echo "<tr>";
  foreach($chars as $char) {
    if (!preg_match("/^[!-~]+$/", $char)) {
      $char = "<span style='color:red'>?</span>";
    } else {
      $char = htmlspecialchars($char);
    }
    $code = dechex($code);
    echo "<td align='center'>{$char}</td>";
  }
  echo "</tr>";

  echo "<tr>";
  foreach($codes as $code) {
    $code = dechex($code);
    echo "<td align='center'>{$code}</td>";
  }
  echo "</tr>";

  echo "</table>";
  echo "<br />\r\n";
}

$str='%%name%%さん、こんにちは。';
$pat='%%name%%';
$rep='萩山';

$str_jis=mb_convert_encoding($str,'iso-2022-jp','UTF-8');
string_dump($str_jis);
$rep_jis=mb_convert_encoding($rep,'iso-2022-jp','UTF-8');
string_dump($rep_jis);
$str_jis=str_replace($pat,$rep_jis,$str_jis);
string_dump($str_jis);

$fp = fopen('data.txt', 'w');
fwrite($fp, $str_jis);
fclose($fp);
?>


On Wed, 09 Dec 2009 14:24:50 +0900
choice <info @ choice-site.com> wrote:

> 中出と申します。
> 
> 理由があってJISで文字列の置換を行いたいと
> 思っているのですが、うまくいきません。
> 
> ●スクリプト
> <?php // -*- coding: utf-8 -*-
> $str='%%name%%さん、こんにちは。';
> $pat='%%name%%';
> $rep='萩山';
> 
> $str_jis=mb_convert_encoding($str,'iso-2022-jp','UTF-8');
> $rep_jis=mb_convert_encoding($rep,'iso-2022-jp','UTF-8');
> $str_jis=str_replace($pat,$rep_jis,$str_jis);
> 
> $fp = fopen('data.txt', 'w');
> fwrite($fp, $str_jis);
> fclose($fp);
> ?>
> 
> スクリプトはUTF8で実装しています。
> 処理としては、JISの文字列から%%name%%を探し、置換を行い
> ファイルに保存するとなっています。
> 
> ファイルには
>> 萩山さん、こんにちは。
>> 
> と保存されることを期待するのですが、実際には
> 
>> 萩山[$B$5$s!"$3$s$K$A$O!#
>> 
> のようになりうまくいきません。
> 
> 
> なお、UTF8で置換を行い、その後、JISに変換して保存するという方法は
> 分かっているのですが、「JISで文字列の置換」が解消した問題なので
> この方法はパスしています。
> 
> よい解消方法があれば教えてください。
> よろしくお願いします。
> 
> ----
> 
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3

--------------------------------------------
菊澤 正明  mailto:kikuzawa @ cyber-coo.com



PHP-users メーリングリストの案内