KAKASIでファイルのリネーム
日本語の名前がついているmp3やoggファイルを他のPCで再生しようとしたら
ファイル名が文字化けして読めませんでした。
ファイル名の文字コードを変換してもいいのだけれど、
それだと行ったり来たりするたびに変換しないといけなくなる、ということで、
多少読みにくいですが、ローマ字化してしまおうということに。
漢字仮名混じり文->ローマ字 への変換はkakasiを使います。
ただ、kakasiは文字コードEUCということで決め打ちしてあるらしいので、UTF-8を扱えない。
それを補うためのラッパーをCで書いて、それをシェルスクリプトで使うことにしました。
kakasiのライブラリとglibを使用しています。
kakasiq.c
/* gcc kakasiq.c -o kakasiq -lkakasi `pkg-config --cflags --libs glib-2.0` */ /* 使い方 .1 kakasiq [kakasiのオプション] "変換対象文字列" */ /* 使い方 .2 他のプログラム | kakasiq [kakasiのオプション] */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <locale.h> #include <string.h> #include <glib.h> #include <libkakasi.h> int main(int argc, char *argv[]) { setlocale( LC_ALL, "ja_JP.UTF-8" ); int isPipedin = isatty(fileno(stdin)); int i, j, c, wflag=0; char *ichar, *retchar; gchar *eucchar; gchar *utf8char; gsize bytes_written, bytes_read; GError *error; GString *gstr = g_string_new(""); /* 文字列を パイプから受け取っているか(if節内)、引数で受け取っているか(else節内) で振り分け。前準備 */ /* int i をkakasi_getopt_argv に渡す引数の数の調整用に使っている */ if(!isPipedin){ while( (c=getc(stdin) ) != EOF){ g_string_append_c(gstr, c); } ichar = gstr->str; i=0; } else { ichar = argv[argc-1]; i=1; } argv[0][6] = '\0'; /* argv[0] : kakasiq -> kakasi */ /* 文字列をEUCに変換し、kakasiに渡し、結果を再びUTF-8に変換 */ eucchar = g_convert(ichar, -1, "EUC-JP", "UTF-8", &bytes_read, &bytes_written, &error); kakasi_getopt_argv(argc-i, argv); retchar = kakasi_do(eucchar); utf8char = g_convert(retchar, -1, "UTF-8", "EUC-JP", &bytes_read, &bytes_written, &error); /* 半角スペースを_に変換 ただし -w オプションを使っている時は変換しない */ for(j=1; j<argc; j++) if(strcmp(argv[j], "-w")==0) wflag = 1 ; if(wflag!=1) for(j=0; j<strlen(utf8char); j++) if(utf8char[j] == ' ') utf8char[j] = '_' ; /* puts */ puts(utf8char); free(retchar); return 0; }
mp3romajize.sh
#!/bin/sh for file in *.mp3 *.ogg do FILENAME1=$file FILENAME2=`kakasiq -Ha -Ka -Ja -Ea -ka "\$file"` echo $FILENAME1 $FILENAME2 mv "$FILENAME1" "$FILENAME2" done
kakasiq と mp3romajize.sh を/usr/binにコピーしてしまったら、
変換したいファイルがあるディレクトリでmp3romajize.shを実行するだけです。
ライブ->raibu となってしまったり、長いタイトルが読みにくくなってしまったりと
微妙なところはありますが、
とりあえず判別がつくようになったのでよし。
改善案:
分かち書きを利用して、分かたれた文節の頭文字を大文字にする。