From f5112752e7462c8b6161ddeb548e2232c2d00d0b Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Wed, 15 Jan 2014 16:23:41 -0300 Subject: [PATCH 1/2] Bug 9579: use String::Multibyte to correctly truncate facets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As Bernardo pointed on comment #17, the incorrect display of multibyte strings in facets is related to the way they are currently truncated. C4::Search::getRecords relies on CORE::substr for the task, which only counts bytes, and thus doesn't check it is breaking multi-byte characters. This patch replaces both the use of CORE::substr and CORE::length for their String::Multibyte counterpart. To test: - Set FacetLabelTruncationLength = 4 to make sure it will try to truncate the facet label. - Add a record with multiple multibyte characters in the author name (copy and paste 'ակ' several times so it is looong). Note: make sure there are at least two records so you're presented the search results. - Reindex zebra to make it possible to search the record. - Search for the record. - Notice the facet with cyrillic characters is broken in the place it gets truncated. - Apply the patch and repeat the search. - Notice the string is not broken. - Sign off. Regards To+ Sponsored-by: Universidad Nacional de Cordoba --- C4/Search.pm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/C4/Search.pm b/C4/Search.pm index 18a0f5f..edaa5de 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -36,6 +36,7 @@ use URI::Escape; use Business::ISBN; use MARC::Record; use MARC::Field; +use String::Multibyte; use utf8; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG); @@ -580,13 +581,13 @@ sub getRecords { # fix the length that will display in the label, my $facet_label_value = $one_facet; my $facet_max_length = C4::Context->preference( - 'FacetLabelTruncationLength') - || 20; - $facet_label_value = - substr( $one_facet, 0, $facet_max_length ) - . "..." - if length($facet_label_value) > - $facet_max_length; + 'FacetLabelTruncationLength') || 20; + my $mbsp = String::Multibyte->new('UTF8'); + if ($mbsp->length($facet_label_value) > $facet_max_length ) { + $facet_label_value = + $mbsp->substr( $one_facet, 0, $facet_max_length ) + . "..."; + } # if it's a branch, label by the name, not the code, if ( $link_value =~ /branch/ ) { -- 1.8.3.2