diff --git a/scripts/Chessa/URI/Plugin/Default.pm b/scripts/Chessa/URI/Plugin/Default.pm
index e4d0138691459b8284c10a2beed86523a95bf8fe..80b1b0c45a0931b27cbf462bcb87d93a6330754c 100644
--- a/scripts/Chessa/URI/Plugin/Default.pm
+++ b/scripts/Chessa/URI/Plugin/Default.pm
@@ -111,7 +111,7 @@ sub head {
         return if (!defined($size) || (($size < SZ_MEGABYTE) && ($type =~ m!^image/!)));
         $on_info->(
             $self->{msg}('Type', $type) . ' ' .
-            $self->{msg}('Size', $self->format_size($size)) . 
+            $self->{msg}('Size', $self->humanize($size)) . 
             ($redirect ? ' ' . $self->{msg}('Redirect', $redirect) : '')
         );
     }
@@ -122,23 +122,17 @@ my @scale = (
     [SZ_MEGABYTE, 'MB'],
     [SZ_KILOBYTE, 'kB'],
 );
+my @units = split //, 'kMGTPEZY';
 
-sub format_size {
+sub humanize {
     my $self = shift;
     my ($size) = @_;
-    my $fmt = '%d B';
-
-    return 'N/A' unless defined($size);
-    for my $i (@scale) {
-        my ($scale, $text) = ($i->[0], $i->[1]);
-        if ($size > $scale) {
-            $size /= $scale;
-            $fmt = '%.02f ' . $text;
-            last;
-        } 
-    }
+    my $radix = log($size) / log(1024);
+    $radix = 9 if $radix > 9;
+
+    my $val = $size / (1024 ** $radix);
 
-    return sprintf $fmt, $size;
+    return sprintf("%.02f%s", $val, $units[$radix - 1] . 'iB');
 }
 
 sub redirect {