diff -upr SVN-Web-0.63.org/lib/SVN/Web/Blame.pm SVN-Web-0.63.mod/lib/SVN/Web/Blame.pm --- SVN-Web-0.63.org/lib/SVN/Web/Blame.pm 2012-10-17 18:20:04.000000000 +0900 +++ SVN-Web-0.63.mod/lib/SVN/Web/Blame.pm 2026-04-29 03:17:06.279084000 +0900 @@ -6,6 +6,7 @@ use warnings; use base 'SVN::Web::action'; use Encode (); +use Jcode; our $VERSION = 0.62; @@ -132,6 +133,25 @@ sub run { my $rev = $act_rev; + my $mime_type; + my $charset = ''; + my $props = $self->ctx_propget( 'svn:mime-type', $uri, $rev, 0 ); + if ( exists $props->{$uri} ) { + $mime_type = $props->{$uri}; + if ($mime_type =~ /(^|;)[ ]*charset[ ]*=[ ]*(.+?)($|;)/) { + $charset = $2; + } + } else { + $mime_type = 'text/plain'; + } + + my $enc_name = 'utf8'; + if (0 < length($charset)) { + $enc_name = $charset; + } else { + $enc_name = 'eucjp'; + } + my @blame_details; $self->ctx_blame( @@ -144,20 +164,11 @@ sub run { rev => $_[1], author => $_[2], date => $self->format_svn_timestamp( $_[3] ), - line => Encode::decode('utf8',$_[4]), + line => Encode::decode($enc_name, $_[4]), }; } ); - my $mime_type; - my $props = $self->ctx_propget( 'svn:mime-type', $uri, $rev, 0 ); - if ( exists $props->{$uri} ) { - $mime_type = $props->{$uri}; - } - else { - $mime_type = 'text/plain'; - } - return { template => 'blame', data => { diff -upr SVN-Web-0.63.org/lib/SVN/Web/Diff.pm SVN-Web-0.63.mod/lib/SVN/Web/Diff.pm --- SVN-Web-0.63.org/lib/SVN/Web/Diff.pm 2012-10-17 18:20:04.000000000 +0900 +++ SVN-Web-0.63.mod/lib/SVN/Web/Diff.pm 2026-04-29 03:15:55.519156000 +0900 @@ -8,6 +8,7 @@ use warnings; use base 'SVN::Web::action'; use Encode (); +use Jcode; use SVN::Core; use SVN::Ra; use SVN::Client; @@ -213,7 +214,8 @@ sub run { $mime eq 'text/plain' and $style = 'Unified'; if ( $mime eq 'text/html' ) { - my $out = Encode::decode('utf8',$self->svn_get_diff($uri, $rev1, $uri, $rev2, 0)); + my $out_tmp = $self->svn_get_diff($uri, $rev1, $uri, $rev2, 0); + my $out = Jcode::convert($out_tmp, 'utf8'); my $diff; my $diff_size = length($out); my $max_diff_size = $self->{opts}{max_diff_size} || 0; diff -upr SVN-Web-0.63.org/lib/SVN/Web/DiffParser.pm SVN-Web-0.63.mod/lib/SVN/Web/DiffParser.pm --- SVN-Web-0.63.org/lib/SVN/Web/DiffParser.pm 2012-10-17 18:20:04.000000000 +0900 +++ SVN-Web-0.63.mod/lib/SVN/Web/DiffParser.pm 2026-04-29 03:17:10.129058000 +0900 @@ -9,6 +9,10 @@ use vars qw( $VERSION ); use Carp; use IO::File; +use Encode (); +use Jcode; +our $enc_name = 'utf8'; + $VERSION = 0.62; #$VERSION = '0.62'; #$VERSION = eval $VERSION; # see L @@ -165,6 +169,14 @@ sub parse_file { while (<$fh>) { $self->{state}{context} = "line $. of $self->{source}"; + + if (0 < length($_)) { + $enc_name = Jcode::getcode($_); + if ('euc' =~ $enc_name) { + $enc_name = 'eucjp'; + } + } + $self->_parse_line($_); } my $ok = $self->{state}{OK}; @@ -180,6 +192,13 @@ sub parse { $self->{changes} = []; $self->{state} = { OK => 1 }; + if (0 < length($text)) { + $enc_name = Jcode::getcode($text); + if ('euc' =~ $enc_name) { + $enc_name = 'eucjp'; + } + } + my $l = 1; while ( $text =~ /(.+?\n)/g ) { $self->{state}{context} = "line $l of string"; @@ -407,7 +426,8 @@ sub _new_line { $change->{at1}++ unless $mod eq 'ADD'; # - or ' ', advance in file1 $change->{at2}++ unless $mod eq 'REMOVE'; # + or ' ', advance in file2 - push @{ $change->{lines} }, $text; + my $text_out = Encode::decode($enc_name, $text); + push @{ $change->{lines} }, $text_out; } ###################################################################### diff -upr SVN-Web-0.63.org/lib/SVN/Web/Revision.pm SVN-Web-0.63.mod/lib/SVN/Web/Revision.pm --- SVN-Web-0.63.org/lib/SVN/Web/Revision.pm 2012-10-17 18:20:04.000000000 +0900 +++ SVN-Web-0.63.mod/lib/SVN/Web/Revision.pm 2026-04-29 03:03:01.030160000 +0900 @@ -6,6 +6,7 @@ use warnings; use base 'SVN::Web::action'; use Encode (); +use Jcode; use SVN::Core; use SVN::Ra; use SVN::Web::X; @@ -219,7 +220,8 @@ sub run { my $diff; my $diff_size = 0; if ( $self->{opts}{show_diff} ) { - my $out = Encode::decode('utf8', $self->svn_get_diff($uri, $rev - 1, $uri, $rev, 1)); + my $out_tmp = $self->svn_get_diff($uri, $rev - 1, $uri, $rev, 1); + my $out = Jcode::convert($out_tmp, 'utf8'); $diff_size = length($out); if ( $diff_size <= $max_diff_size ) { $diff = SVN::Web::DiffParser->new($out); diff -upr SVN-Web-0.63.org/lib/SVN/Web/View.pm SVN-Web-0.63.mod/lib/SVN/Web/View.pm --- SVN-Web-0.63.org/lib/SVN/Web/View.pm 2012-10-17 18:20:04.000000000 +0900 +++ SVN-Web-0.63.mod/lib/SVN/Web/View.pm 2026-04-29 03:17:14.239060000 +0900 @@ -6,6 +6,7 @@ use warnings; use base 'SVN::Web::action'; use Encode (); +use Jcode; our $VERSION = 0.62; @@ -143,17 +144,33 @@ sub run { open( $fh, '>', \$fc ); $self->ctx_cat( $fh, $uri, $rev ); close($fc); - $fc = Encode::decode('utf8', $fc); my $mime_type; + my $charset = ''; my $props = $self->ctx_propget( 'svn:mime-type', $uri, $rev, 0 ); if ( exists $props->{$uri} ) { $mime_type = $props->{$uri}; + if ($mime_type =~ /(^|;)[ ]*charset[ ]*=[ ]*(.+?)($|;)/) { + $charset = $2; + } } else { $mime_type = 'text/plain'; } + my $enc_name = 'utf8'; + if (0 < length($charset)) { + $enc_name = $charset; + } else { + if (0 < length($fc)) { + $enc_name = Jcode::getcode($fc); + if ('euc' =~ $enc_name) { + $enc_name = 'eucjp'; + } + } + } + my $fc_internallocale = Encode::decode($enc_name, $fc); + return { template => 'view', data => { @@ -162,7 +179,7 @@ sub run { youngest_rev => $yng_rev, at_head => $head, mimetype => $mime_type, - file => $fc, + file => $fc_internallocale, %{ $self->{REV} }, } };