[PHP-users 12100] Re: SJISをEUC へ一括変換できませんか?nkf ??

Yasuo Ohgaki php-users@php.gr.jp
Mon, 09 Dec 2002 11:05:42 +0900


titi@beefarm.jp wrote:
> 発言元のkisumiです。みなさんありがとうございました。
>
> qkcで一括変換できました。
>

大垣です。

# 私もfind+xargs+some_convert_command一行で変換します。
# qkcは使っていませんが、確か同じファイル名での変換をサポート
# しているのですよね?

もう収束しているようですが、参考までに、PHPスクリプトで書
くならこんな感じになります。5分くらいで作ったので、まだまだ
改良の余地が多くあります。

再帰的に変換するファイルリストを作成し、ファイルの文字エンコー
ディングをEUC-JPに変換するスクリプトです。

UNIXのコマンドを勉強する事も重要ですが、プログラムを自分で
作るのもPHPプログラミングの勉強にもなって良いと思います。

# 言語を習得するには簡単にできそうな事は、その言語で何でも
# 作ってみると取得が早いと思います。

-----------------
#!/usr/local/bin/php -n
<?php
// requires PHP4.3.0 or later php binary(CLI) for -n flag and arg handling
// Usage: script_name dir_name
// Convert char encoding to EUC-JP under dir_name

if (empty($argv[1]) || !is_dir($argv[1])) {
	die("Need dir as parameter\n");
}

convert($argv[1]);

// functions

function convert($dir)
{
	$files = get_file_list($dir);
	if (empty($files)) {
		die("Something wrong\n");
	}
	foreach($files as $file) {
		$sjis = mb_convert_encoding(file_get_contents($file), 'EUC-JP', 'auto');
		$fp = fopen($file.'.eucjp', 'w');
		fputs($fp, $sjis);
	}
}

function get_file_list($dir)
{
	$result = array();
	$dirent = opendir($dir);
	readdir($dirent);readdir($dirent); // skip . and ..
	while ($file = readdir($dirent)) {
		$f = $dir.'/'.$file;
		if (is_file($f)) {
			$result[] = $f;
		}
		else if (is_dir($f)) {
			$result += get_file_list($f);
		}
	}
	return $result;
}
?>
--------------------

Yasuo Ohgaki