=cut
sub FixEncoding {
my $marc=shift;
+ my $encoding=shift;
my $record = MARC::Record->new_from_usmarc($marc);
- if (C4::Context->preference("MARCFLAVOUR") eq "UNIMARC"){
- use Encode::Guess;
- my $targetcharset="utf8" if (C4::Context->preference("TemplateEncoding") eq "utf-8");
- $targetcharset="latin1" if (C4::Context->preference("TemplateEncoding") eq "iso-8859-1");
- my $decoder = guess_encoding($marc, qw/utf8 latin1/);
-# die $decoder unless ref($decoder);
- if (ref($decoder)) {
+ if (C4::Context->preference("marcflavour") eq "UNIMARC"){
+ my $targetcharset="utf8";
+ if ($encoding && $targetcharset ne $encoding){
my $newRecord=MARC::Record->new();
- foreach my $field ($record->fields()){
- if ($field->tag()<'010'){
- $newRecord->insert_grouped_field($field);
- } else {
- my $newField;
- my $createdfield=0;
- foreach my $subfield ($field->subfields()){
- if ($createdfield){
- if (($newField->tag eq '100')) {
- substr($subfield->[1],26,2,"0103") if ($targetcharset eq "latin1");
- substr($subfield->[1],26,4,"5050") if ($targetcharset eq "utf8");
+ if ($encoding!~/5426/){
+ use Text::Iconv;
+ my $decoder = Text::Iconv->new($encoding,$targetcharset);
+ my $newRecord=MARC::Record->new();
+ foreach my $field ($record->fields()){
+ if ($field->tag()<'010'){
+ $newRecord->insert_grouped_field($field);
+ } else {
+ my $newField;
+ my $createdfield=0;
+ foreach my $subfield ($field->subfields()){
+ if ($createdfield){
+ if (($newField->tag eq '100')) {
+ substr($subfield->[1],26,2,"0103") if ($targetcharset eq "latin1");
+ substr($subfield->[1],26,4,"5050") if ($targetcharset eq "utf8");
+ }
+ map {$decoder->convert($_)} @$subfield;
+ $newField->add_subfields($subfield->[0]=>$subfield->[1]);
+ } else {
+ map {$decoder->convert($_)} @$subfield;
+ $newField=MARC::Field->new($field->tag(),$field->indicator(1),$field->indicator(2),$subfield->[0]=>$subfield->[1]);
+ $createdfield=1;
+ }
+ }
+ $newRecord->insert_grouped_field($newField);
}
- map {C4::Biblio::char_decode($_,"UNIMARC")} @$subfield;
- $newField->add_subfields($subfield->[0]=>$subfield->[1]);
- } else {
- map {C4::Biblio::char_decode($_,"UNIMARC")} @$subfield;
- $newField=MARC::Field->new($field->tag(),$field->indicator(1),$field->indicator(2),$subfield->[0]=>$subfield->[1]);
- $createdfield=1;
- }
- }
- $newRecord->insert_grouped_field($newField);
- }
+ }
+ }elsif ($encoding=~/5426/){
+ use MARC::Charset;
+ my $newRecord=MARC::Record->new();
+ foreach my $field ($record->fields()){
+ if ($field->tag()<'010'){
+ $newRecord->insert_grouped_field($field);
+ } else {
+ my $newField;
+ my $createdfield=0;
+ foreach my $subfield ($field->subfields()){
+ if ($createdfield){
+ if (($newField->tag eq '100')) {
+ substr($subfield->[1],26,4,"5050");
+ }
+ $newField->add_subfields($subfield->[0]=>MARC::Charset::marc8_to_utf8($subfield->[1]));
+ } else {
+ $newField=MARC::Field->new($field->tag(),$field->indicator(1),$field->indicator(2),$subfield->[0]=>MARC::Charset::marc8_to_utf8($subfield->[1]));
+ $createdfield=1;
+ }
+ }
+ $newRecord->insert_grouped_field($newField);
+ }
+ }
}
# warn $newRecord->as_formatted();
return $newRecord;
- } else {
- return $record;
- }
- } else {
- return $record;
+ }
+ return $record;
}
+ return $record;
}
=head2 GetKohaAuthorisedValues