summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2003-01-16 20:36:23 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2003-01-16 20:36:23 +0000
commit88632417a970dff8f92718b0800b1aa1400cb4ae (patch)
treeea66b4eab7dfc6a1a4ebdd064c01f1f0095bcfe1 /pp.c
parentcaf774a6b47c93401a4581fab332b04b560c89d5 (diff)
downloadperl-88632417a970dff8f92718b0800b1aa1400cb4ae.tar.gz
Fix 'use encoding' I/O for code points 0x80..0xFF;
code changes from Inaba Hiroto; test tweaks by jhi. p4raw-id: //depot/perl@18496
Diffstat (limited to 'pp.c')
-rw-r--r--pp.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/pp.c b/pp.c
index c78246e7de..c9d1dc67f0 100644
--- a/pp.c
+++ b/pp.c
@@ -3278,8 +3278,19 @@ PP(pp_chr)
*tmps++ = (char)value;
*tmps = '\0';
(void)SvPOK_only(TARG);
- if (PL_encoding)
+ if (PL_encoding && !IN_BYTES) {
sv_recode_to_utf8(TARG, PL_encoding);
+ tmps = SvPVX(TARG);
+ if (SvCUR(TARG) == 0 || !is_utf8_string((U8*)tmps, SvCUR(TARG)) ||
+ memEQ(tmps, "\xef\xbf\xbd\0", 4)) {
+ SvGROW(TARG,3);
+ SvCUR_set(TARG, 2);
+ *tmps++ = (U8)UTF8_EIGHT_BIT_HI(value);
+ *tmps++ = (U8)UTF8_EIGHT_BIT_LO(value);
+ *tmps = '\0';
+ SvUTF8_on(TARG);
+ }
+ }
XPUSHs(TARG);
RETURN;
}