adding encoding management to z3950
authorHenri-Damien LAURENT <henridamien@koha-fr.org>
Tue, 8 Jan 2008 22:43:21 +0000 (16:43 -0600)
committerJoshua Ferraro <jmf@liblime.com>
Wed, 9 Jan 2008 01:23:00 +0000 (19:23 -0600)
Signed-off-by: Chris Cormack <crc@liblime.com>
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
C4/Koha.pm
cataloguing/z3950_search.pl

index d7ed41d..8db25ff 100644 (file)
@@ -844,46 +844,69 @@ Returns a well encoded marcrecord.
 =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
index 3703ce7..7c4e146 100755 (executable)
@@ -147,7 +147,7 @@ else {
               || $DEBUG
               && warn( "" . $oConnection[$s]->errmsg() );
             $serverhost[$s] = $server->{host};
-            $encoding[$s]   = $server->{syntax};
+            $encoding[$s]   = $server->{encoding};
             $s++;
         }    ## while fetch
     }    # foreach
@@ -198,7 +198,7 @@ else {
                     my $rec = $oResult[$k]->record($i);
                     my $marcrecord;
                     $marcdata   = $rec->raw();
-                    $marcrecord = FixEncoding($marcdata);
+                    $marcrecord = FixEncoding($marcdata,$encoding[$k]);
 ####WARNING records coming from Z3950 clients are in various character sets MARC8,UTF8,UNIMARC etc
 ## In HEAD i change everything to UTF-8
 # In rel2_2 i am not sure what encoding is so no character conversion is done here