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 となってしまったり、長いタイトルが読みにくくなってしまったりと
微妙なところはありますが、
とりあえず判別がつくようになったのでよし。


改善案:
分かち書きを利用して、分かたれた文節の頭文字を大文字にする。