LP1584891: Export MARC holdings with UTF8 subfields
authorDan Scott <dscott@laurentian.ca>
Wed, 22 Feb 2017 16:29:21 +0000 (11:29 -0500)
committerDan Scott <dan@coffeecode.net>
Sat, 4 Mar 2017 03:11:17 +0000 (22:11 -0500)
The --items option of marc_export adds a new MARC 852 field with a
number of subfields that it retrieves from the database. If those
subfields (such as call number, copy location, etc) contain Unicode
characters, then we need to decode the incoming UTF8 characters
when adding the subfield values to avoid corrupting the MARC.

Signed-off-by: Dan Scott <dscott@laurentian.ca>
Signed-off-by: Chris Sharp <csharp@georgialibraries.org>

Open-ILS/src/support-scripts/marc_export.in

index 6e0face..5c0115c 100755 (executable)
@@ -22,6 +22,7 @@ use MARC::Field;
 use MARC::Record;
 use MARC::File::XML (BinaryEncoding => 'UTF-8');
 use Date::Manip::Date;
+use Encode;
 my $U = 'OpenILS::Application::AppUtils';
 
 binmode(STDERR, ':utf8');
@@ -480,13 +481,13 @@ sub next {
                             MARC::Field->new(
                                 '852', '4', ' ',
                                 ($location ? ('a' => $location) : ()),
-                                b => $acp->call_number()->owning_lib()->shortname(),
-                                b => $acp->circ_lib()->shortname(),
-                                c => $acp->location()->name(),
-                                j => $acp->call_number()->label(),
-                                ($acp->circ_modifier() ? (g => $acp->circ_modifier()) : ()),
-                                p => $acp->barcode(),
-                                ($price ? (y => $price) : ()),
+                                b => Encode::decode_utf8($acp->call_number()->owning_lib()->shortname()),
+                                b => Encode::decode_utf8($acp->circ_lib()->shortname()),
+                                c => Encode::decode_utf8($acp->location()->name()),
+                                j => Encode::decode_utf8($acp->call_number()->label()),
+                                ($acp->circ_modifier() ? (g => Encode::decode_utf8($acp->circ_modifier())) : ()),
+                                p => Encode::decode_utf8($acp->barcode()),
+                                ($price ? (y => Encode::decode_utf8($price)) : ()),
                                 ($acp->copy_number() ? (t => $acp->copy_number()) : ()),
                                 ($U->is_true($acp->ref()) ? (x => 'reference') : ()),
                                 (!$U->is_true($acp->holdable()) ? (x => 'unholdable') : ()),