#!/usr/local/bin/perl # # roman2utf8 # --- # This script takes one argument, a filename, translates it into # MacOS X Finder-compatible (extended character) UTF8, and # renames the file. # # Be sure the filename you're running it on is MacRoman or # it's name will get foobar-ed # # # YOU'LL PROBABLY WANT TO MODIFY HOW PARAMETER # GETTING AND LINK/UNLINKING WORKS # # we can't just use UTF8 character here because the OSX Finder # is stupid and wants a certain kind of UTF8 our %roman_to_utf8 = ( 128 => 'A'.pack(CC,204,136), 129 => 'A'.pack(CC,204,138), 130 => 'C'.pack(CC,204,167), 131 => 'E'.pack(CC,204,129), 132 => 'N'.pack(CC,204,131), 133 => 'O'.pack(CC,204,136), 134 => 'U'.pack(CC,204,136), 135 => 'a'.pack(CC,204,129), 136 => 'a'.pack(CC,204,128), 137 => 'a'.pack(CC,204,130), 138 => 'a'.pack(CC,204,136), 139 => 'a'.pack(CC,204,131), 140 => 'a'.pack(CC,204,138), 141 => 'c'.pack(CC,204,167), 142 => 'e'.pack(CC,204,129), 143 => 'e'.pack(CC,204,128), 144 => 'e'.pack(CC,204,130), 145 => 'e'.pack(CC,204,136), 146 => 'i'.pack(CC,204,129), 147 => 'i'.pack(CC,204,128), 148 => 'i'.pack(CC,204,130), 149 => 'i'.pack(CC,204,136), 150 => 'n'.pack(CC,204,131), 151 => 'o'.pack(CC,204,129), 152 => 'o'.pack(CC,204,128), 153 => 'o'.pack(CC,204,130), 154 => 'o'.pack(CC,204,136), 155 => 'o'.pack(CC,204,131), 156 => 'u'.pack(CC,204,129), 157 => 'u'.pack(CC,204,128), 158 => 'u'.pack(CC,204,130), 159 => 'u'.pack(CC,204,136), 160 => pack(CCC,226,128,160), 161 => pack(CC,194,176), 162 => pack(CC,194,162), 163 => pack(CC,194,163), 164 => pack(CC,194,167), 165 => pack(CCC,226,128,162), 166 => pack(CC,194,182), 167 => pack(CC,195,159), 168 => pack(CC,194,174), 169 => pack(CC,194,169), 170 => pack(CCC,226,132,162), 171 => pack(CC,194,180), 172 => pack(CC,194,168), 173 => pack(CCC,226,137,160), 174 => pack(CC,195,134), 175 => pack(CC,195,152), 176 => pack(CCC,226,136,158), 177 => pack(CC,194,177), 178 => pack(CCC,226,137,164), 179 => pack(CCC,226,137,165), 180 => pack(CC,194,165), 181 => pack(CC,194,181), 182 => pack(CCC,226,136,130), 183 => pack(CCC,226,136,145), 184 => pack(CCC,226,136,143), 185 => pack(CC,207,128), 186 => pack(CCC,226,136,171), 187 => pack(CC,194,170), 188 => pack(CC,194,186), 189 => pack(CC,206,169), 190 => pack(CC,195,166), 191 => pack(CC,195,184), 192 => pack(CC,194,191), 193 => pack(CC,194,161), 194 => pack(CC,194,172), 195 => pack(CCC,226,136,154), 196 => pack(CC,198,146), 197 => pack(CCC,226,137,136), 198 => pack(CCC,226,136,134), 199 => pack(CC,194,171), 200 => pack(CC,194,187), 201 => pack(CCC,226,128,166), 202 => pack(CC,194,160), 203 => 'A'.pack(CC,204,128), 204 => 'A'.pack(CC,204,131), 205 => 'O'.pack(CC,204,131), 206 => pack(CC,197,146), 207 => pack(CC,197,147), 208 => pack(CCC,226,128,147), 209 => pack(CCC,226,128,148), 210 => pack(CCC,226,128,156), 211 => pack(CCC,226,128,157), 212 => pack(CCC,226,128,152), 213 => pack(CCC,226,128,153), 214 => pack(CC,195,183), 215 => pack(CCC,226,151,138), 216 => 'y'.pack(CC,204,136), 217 => 'Y'.pack(CC,204,136), 218 => pack(CCC,226,129,132), 219 => pack(CCC,226,130,172), 220 => pack(CCC,226,128,185), 221 => pack(CCC,226,128,186), 222 => pack(CCC,239,172,129), 223 => pack(CCC,239,172,130), 224 => pack(CCC,226,128,161), 225 => pack(CC,194,183), 226 => pack(CCC,226,128,154), 227 => pack(CCC,226,128,158), 228 => pack(CCC,226,128,176), 229 => 'A'.pack(CC,204,130), 230 => 'E'.pack(CC,204,130), 231 => 'A'.pack(CC,204,129), 232 => 'E'.pack(CC,204,136), 233 => 'E'.pack(CC,204,128), 234 => 'I'.pack(CC,204,129), 235 => 'I'.pack(CC,204,130), 236 => 'I'.pack(CC,204,136), 237 => 'I'.pack(CC,204,128), 238 => 'O'.pack(CC,204,129), 239 => 'O'.pack(CC,204,130), 240 => pack(CCC,239,163,191), 241 => 'O'.pack(CC,204,128), 242 => 'U'.pack(CC,204,129), 243 => 'U'.pack(CC,204,130), 244 => 'U'.pack(CC,204,128), 245 => pack(CC,196,177), 246 => pack(CC,203,134), 247 => pack(CC,203,156), 248 => pack(CC,194,175), 249 => pack(CC,203,152), 250 => pack(CC,203,153), 251 => pack(CC,203,154), 252 => pack(CC,194,184), 253 => pack(CC,203,157), 254 => pack(CC,203,155), 255 => pack(CC,203,135), ); sub myConvert { $num = shift; if(exists($roman_to_utf8{$num})) { return $roman_to_utf8{$num}; } else { return chr($num); } } ## now to actually do something: $fn = shift(@ARGV); @chars = split(/(.)/,$fn); $utf8 = ''; foreach $i (@chars) { if($i) { $utf8 = $utf8.myConvert(ord($i)); } } if(link $fn,$utf8) { unlink($fn); } else { die "Linking of file failed"; } 1; ## # # EOF # ##