PukiwikiをUTF-8へ変更
をテンプレートにして作成
[
Front page
] [
Page list
|
Search
|
Recent changes
|
RSS of recent changes
]
Start:
PukiwikiをEUC-JPからUTF-8化した。以下そのメモ。
***方針 [#bd3542c2]
-一般的な文字コード変換ツールのeuc-jpからは変換しない。一...
-新旧ページのタイムスタンプを維持する。
-旧URLからのアクセスを新URLにリダイレクトする。
***ファイル名の変換の仕方 [#ed739fd8]
ファイル名はeuc-jpの文字列のバイナリをHEXにしただけなので...
proc convert_filename {filename {notchange 0}} {
set rootname [file rootname $filename]
set ext [file ext $filename]
set name [encoding convertfrom euc-jp [binary format...
if {[string is ascii $name]} {
set newname $filename
} else {
set bin [encoding convertto utf-8 $name]
binary scan $bin H* bstr
set newname [string toupper $bstr]$ext
}
if {!$notchange} {
file rename -force $filename $newname
}
return $newname
}
***ファイルの中身の変換の仕方 [#n98f55ac]
先に述べたように、これはeuc-jpからではなく、cp51932から変...
#include <windows.h>
#include <tcl.h>
typedef HRESULT (APIENTRY *LPCONVERTINETSTRING)(LPDWORD,...
typedef HRESULT (APIENTRY *LPISCONVERTINETSTRINGAVALABLE...
static HANDLE hDLL = NULL;
LPCONVERTINETSTRING ConvertINetString = NULL;
LPISCONVERTINETSTRINGAVALABLE IsConvertINetStringAvailab...
static BOOL InitDLL()
{
if(hDLL == NULL){
hDLL = LoadLibrary("mlang.dll");
if(hDLL == NULL){
return FALSE;
}
ConvertINetString = (LPCONVERTINETSTRING)
GetProcAddress(hDLL, "ConvertINetString");
IsConvertINetStringAvailable = (LPISCONVERTINETS...
GetProcAddress(hDLL, "IsConvertINetStringAva...
}
return TRUE;
}
int Eucjp_ReadCmd (ClientData data, Tcl_Interp *interp, ...
{
HRESULT result;
DWORD mode = 0;
unsigned char *barray = NULL;
unsigned char *euc = NULL;
unsigned char *utf = NULL;
int len, euclen, utflen;
if (objc <= 1) {
return TCL_OK;
}
barray = Tcl_GetByteArrayFromObj(objv[1], &len);
if (len == 0) {
return TCL_OK;
}
euclen = len;
utflen = euclen * 3;
euc = calloc(euclen, sizeof(char));
utf = calloc(utflen, sizeof(char));
memcpy(euc, barray, len);
result = ConvertINetString (
&mode,
51932,
65001,
euc, &euclen,
utf, &utflen);
Tcl_SetObjResult(interp, Tcl_NewStringObj(utf, utfle...
if(euc) free(euc);
if(utf) free(utf);
return TCL_OK;
}
DLLEXPORT int Eucjp_Init (Tcl_Interp *interp)
{
if (InitDLL() == FALSE) {
return TCL_ERROR;
}
#ifdef USE_TCL_STUBS
if (Tcl_InitStubs(interp, "8", 0) == NULL) {
return TCL_ERROR;
}
#endif
Tcl_CreateObjCommand(interp, "read_eucjp", Eucjp_Read...
if (Tcl_PkgProvide(interp, "Eucjp", "1.0") != TCL_OK) {
return TCL_ERROR;
}
return TCL_OK;
}
簡単にこんなもんで。これでread_eucjpというコマンドを作成...
proc convert_file_contents {filename} {
set fp [open $filename r]
fconfigure $fp -encoding binary -translation binary
set contents [read $fp]
close $fp
set fp [open $filename w]
fconfigure $fp -encoding utf-8 -translation lf
puts -nonewline $fp [read_eucjp $contents]
close $fp
}
みたいなファイル名を渡すだけで中身を変換するというラッパ...
***リダイレクト [#o170271e]
euc-jpでのURL名と、それを変換したutf-8のURL名を出力して、...
またファイル名を変換する前のwikiディレクトリの中身から作...
proc output_redirect {output_file} {
set fp [open $output_file w]
set pwd [pwd]
cd ${::originaldir}/wiki
foreach f [glob -type f *.txt] {
set eucname [file rootname $f]
set tclname [encoding convertfrom euc-jp [binary...
if {[string is ascii $tclname]} {
continue
}
set from [ncgi::encode [encoding convertto euc-j...
set to [ncgi::encode [encoding convertto utf-8...
puts $fp "Redirect permanent /wiki/${from}.html ...
}
cd $pwd
close $fp
}
output_redirect [file join [file dir [info script]] redi...
URLに.htmlがついてるのはこのサイトが色々小細工しているた...
これで例えば、/wiki/GIMP2%A4%C7%BD%C4%BD%F1%A4%AD.htmlへ...
***各ディレクトリごとにやったこと。 [#q097fc87]
-attach~
_(アンダースコア)で繋いだ"*_*.log", "*_*", "*_*.1" のフ...
-backup~
バックアップはgzで圧縮されているので、解凍して、ファイル...
-cache~
拡張子が.relと.refのファイル名と中身を変換する。recent.da...
-counter~
使用してなかったので何もせず。
-diff~
拡張子が.txtのファイル名と中身を変換する。
-image~
画像なのでなにもしない
-lib~
拡張子が.phpの中身を変換する。init.phpの//UTF-8:define('P...
-plugin~
拡張子が.phpの中身を変換する。search.inc.phpで"EUC-JP"の...
-skin~
pukiwiki.skin.phpだけ中身を変換した。携帯用スキンがよくわ...
-trackback~
使用してなかったので何もせず。
-wiki~
拡張子が.txtのファイルのファイル名と中身を変換する。タイ...
-ルート~
全てのファイルの中身をutf-8に変換する。
***タイムスタンプの維持 [#b5d35445]
とりあえず、ファイルのエンコーディングの変換時にタイムス...
namespace eval timestamp {
variable atime
variable mtime
proc save {f} {
variable atime
variable mtime
set atime [file atime $f]
set mtime [file mtime $f]
}
proc load {f} {
variable atime
variable mtime
file atime $f $atime
file mtime $f $mtime
}
}
このようなものを用意しておいて変換処理の前後を挟むだけ。
timestamp::save $file
convert_file_contents $file
set file [convert_filename $file]
timestamp::load $file
みたいにするだけ。これで変換前と変換後のファイルでタイム...
set fp [open timestamp.cgi w]
fconfigure $fp -translation lf
puts $fp "#!/usr/bin/tclsh"
puts $fp {puts "Content-type: text/html\n\n"}
foreach {dir pattern} {attach *_* wiki *.txt} {
cd $dir
set dir ../wiki/${dir}/
foreach f [glob -type f $pattern] {
puts $fp "file mtime $dir$f [file mtime $f]"
puts $fp "file atime $dir$f [file atime $f]"
}
cd ..
}
close $fp
みたいなスクリプトを回してcgiファイルを作成し、これをアッ...
***スクリプトの残骸 [#s19391ee]
#ref(eucjp2utf8.zip)
***コメントをどーぞ [#s65dd056]
#comment
----
[[CategoryPukiwiki]]
End:
PukiwikiをEUC-JPからUTF-8化した。以下そのメモ。
***方針 [#bd3542c2]
-一般的な文字コード変換ツールのeuc-jpからは変換しない。一...
-新旧ページのタイムスタンプを維持する。
-旧URLからのアクセスを新URLにリダイレクトする。
***ファイル名の変換の仕方 [#ed739fd8]
ファイル名はeuc-jpの文字列のバイナリをHEXにしただけなので...
proc convert_filename {filename {notchange 0}} {
set rootname [file rootname $filename]
set ext [file ext $filename]
set name [encoding convertfrom euc-jp [binary format...
if {[string is ascii $name]} {
set newname $filename
} else {
set bin [encoding convertto utf-8 $name]
binary scan $bin H* bstr
set newname [string toupper $bstr]$ext
}
if {!$notchange} {
file rename -force $filename $newname
}
return $newname
}
***ファイルの中身の変換の仕方 [#n98f55ac]
先に述べたように、これはeuc-jpからではなく、cp51932から変...
#include <windows.h>
#include <tcl.h>
typedef HRESULT (APIENTRY *LPCONVERTINETSTRING)(LPDWORD,...
typedef HRESULT (APIENTRY *LPISCONVERTINETSTRINGAVALABLE...
static HANDLE hDLL = NULL;
LPCONVERTINETSTRING ConvertINetString = NULL;
LPISCONVERTINETSTRINGAVALABLE IsConvertINetStringAvailab...
static BOOL InitDLL()
{
if(hDLL == NULL){
hDLL = LoadLibrary("mlang.dll");
if(hDLL == NULL){
return FALSE;
}
ConvertINetString = (LPCONVERTINETSTRING)
GetProcAddress(hDLL, "ConvertINetString");
IsConvertINetStringAvailable = (LPISCONVERTINETS...
GetProcAddress(hDLL, "IsConvertINetStringAva...
}
return TRUE;
}
int Eucjp_ReadCmd (ClientData data, Tcl_Interp *interp, ...
{
HRESULT result;
DWORD mode = 0;
unsigned char *barray = NULL;
unsigned char *euc = NULL;
unsigned char *utf = NULL;
int len, euclen, utflen;
if (objc <= 1) {
return TCL_OK;
}
barray = Tcl_GetByteArrayFromObj(objv[1], &len);
if (len == 0) {
return TCL_OK;
}
euclen = len;
utflen = euclen * 3;
euc = calloc(euclen, sizeof(char));
utf = calloc(utflen, sizeof(char));
memcpy(euc, barray, len);
result = ConvertINetString (
&mode,
51932,
65001,
euc, &euclen,
utf, &utflen);
Tcl_SetObjResult(interp, Tcl_NewStringObj(utf, utfle...
if(euc) free(euc);
if(utf) free(utf);
return TCL_OK;
}
DLLEXPORT int Eucjp_Init (Tcl_Interp *interp)
{
if (InitDLL() == FALSE) {
return TCL_ERROR;
}
#ifdef USE_TCL_STUBS
if (Tcl_InitStubs(interp, "8", 0) == NULL) {
return TCL_ERROR;
}
#endif
Tcl_CreateObjCommand(interp, "read_eucjp", Eucjp_Read...
if (Tcl_PkgProvide(interp, "Eucjp", "1.0") != TCL_OK) {
return TCL_ERROR;
}
return TCL_OK;
}
簡単にこんなもんで。これでread_eucjpというコマンドを作成...
proc convert_file_contents {filename} {
set fp [open $filename r]
fconfigure $fp -encoding binary -translation binary
set contents [read $fp]
close $fp
set fp [open $filename w]
fconfigure $fp -encoding utf-8 -translation lf
puts -nonewline $fp [read_eucjp $contents]
close $fp
}
みたいなファイル名を渡すだけで中身を変換するというラッパ...
***リダイレクト [#o170271e]
euc-jpでのURL名と、それを変換したutf-8のURL名を出力して、...
またファイル名を変換する前のwikiディレクトリの中身から作...
proc output_redirect {output_file} {
set fp [open $output_file w]
set pwd [pwd]
cd ${::originaldir}/wiki
foreach f [glob -type f *.txt] {
set eucname [file rootname $f]
set tclname [encoding convertfrom euc-jp [binary...
if {[string is ascii $tclname]} {
continue
}
set from [ncgi::encode [encoding convertto euc-j...
set to [ncgi::encode [encoding convertto utf-8...
puts $fp "Redirect permanent /wiki/${from}.html ...
}
cd $pwd
close $fp
}
output_redirect [file join [file dir [info script]] redi...
URLに.htmlがついてるのはこのサイトが色々小細工しているた...
これで例えば、/wiki/GIMP2%A4%C7%BD%C4%BD%F1%A4%AD.htmlへ...
***各ディレクトリごとにやったこと。 [#q097fc87]
-attach~
_(アンダースコア)で繋いだ"*_*.log", "*_*", "*_*.1" のフ...
-backup~
バックアップはgzで圧縮されているので、解凍して、ファイル...
-cache~
拡張子が.relと.refのファイル名と中身を変換する。recent.da...
-counter~
使用してなかったので何もせず。
-diff~
拡張子が.txtのファイル名と中身を変換する。
-image~
画像なのでなにもしない
-lib~
拡張子が.phpの中身を変換する。init.phpの//UTF-8:define('P...
-plugin~
拡張子が.phpの中身を変換する。search.inc.phpで"EUC-JP"の...
-skin~
pukiwiki.skin.phpだけ中身を変換した。携帯用スキンがよくわ...
-trackback~
使用してなかったので何もせず。
-wiki~
拡張子が.txtのファイルのファイル名と中身を変換する。タイ...
-ルート~
全てのファイルの中身をutf-8に変換する。
***タイムスタンプの維持 [#b5d35445]
とりあえず、ファイルのエンコーディングの変換時にタイムス...
namespace eval timestamp {
variable atime
variable mtime
proc save {f} {
variable atime
variable mtime
set atime [file atime $f]
set mtime [file mtime $f]
}
proc load {f} {
variable atime
variable mtime
file atime $f $atime
file mtime $f $mtime
}
}
このようなものを用意しておいて変換処理の前後を挟むだけ。
timestamp::save $file
convert_file_contents $file
set file [convert_filename $file]
timestamp::load $file
みたいにするだけ。これで変換前と変換後のファイルでタイム...
set fp [open timestamp.cgi w]
fconfigure $fp -translation lf
puts $fp "#!/usr/bin/tclsh"
puts $fp {puts "Content-type: text/html\n\n"}
foreach {dir pattern} {attach *_* wiki *.txt} {
cd $dir
set dir ../wiki/${dir}/
foreach f [glob -type f $pattern] {
puts $fp "file mtime $dir$f [file mtime $f]"
puts $fp "file atime $dir$f [file atime $f]"
}
cd ..
}
close $fp
みたいなスクリプトを回してcgiファイルを作成し、これをアッ...
***スクリプトの残骸 [#s19391ee]
#ref(eucjp2utf8.zip)
***コメントをどーぞ [#s65dd056]
#comment
----
[[CategoryPukiwiki]]
Page:
HTML convert time: 0.003 sec.