summaryrefslogtreecommitdiff
path: root/FS/FS/Misc.pm
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2015-03-25 11:21:32 -0700
committerMark Wells <mark@freeside.biz>2015-03-25 11:21:32 -0700
commit1c9056a27c303170060004c1be93787c6a32dcb6 (patch)
tree0c22c15376f0bf8a874e7ee9c604e392eabc4f31 /FS/FS/Misc.pm
parent5adac2bcd86a2bb0ddf7b016b5ed1dcd04635aa0 (diff)
paymentech: enforce field lengths in raw bytes, #29972
Diffstat (limited to 'FS/FS/Misc.pm')
-rw-r--r--FS/FS/Misc.pm21
1 files changed, 21 insertions, 0 deletions
diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm
index f597058..9aeff93 100644
--- a/FS/FS/Misc.pm
+++ b/FS/FS/Misc.pm
@@ -22,6 +22,7 @@ use Encode;
generate_ps generate_pdf do_print
csv_from_fixed
ocr_image
+ bytes_substr
);
$DEBUG = 0;
@@ -961,6 +962,26 @@ sub ocr_image {
@lines;
}
+=item bytes_substr STRING, OFFSET[, LENGTH[, REPLACEMENT] ]
+
+A replacement for "substr" that counts raw bytes rather than logical
+characters. Unlike "bytes::substr", will suppress fragmented UTF-8 characters
+rather than output them. Unlike real "substr", is not an lvalue.
+
+=cut
+
+sub bytes_substr {
+ my ($string, $offset, $length, $repl) = @_;
+ my $bytes = substr(
+ Encode::encode('utf8', $string),
+ $offset,
+ $length,
+ Encode::encode('utf8', $repl)
+ );
+ my $chk = $DEBUG ? Encode::FB_WARN : Encode::FB_QUIET;
+ return Encode::decode('utf8', $bytes, $chk);
+}
+
=back
=head1 BUGS