Noone else posted anything, so I'll give it a quick go...
It seems you're assuming Perl's internal format is UTF-8.
To be sure, it would help if I knew exactly what you were getting from the database. The "PV = " lines printed by following would provide that info.
use Devel::Peek qw( Dump );
Dump($db_field); # Output sent to STDERR
You should get one of the following four output combinations for chr(259) and chr(238).
259: PV = 0x18e914c "\304\203"\0 [UTF8 "\x{103}"]
238: PV = 0x18e914c "\356"\0
259: PV = 0x18e914c "\304\203"\0 [UTF8 "\x{103}"]
238: PV = 0x18ecffc "\303\256"\0 [UTF8 "\x{ee}"]
259: PV = 0x18d73fc "?"\0
238: PV = 0x18d7444 "\356"\0
259: PV = 0x18d736c "\304\203"\0
238: PV = 0x18ecffc "\303\256"\0
259: PV = 0x18d74dc "\304\203"\0 <- Lack of [UTF8 ...]
238: PV = 0x18d74dc "\356"\0
-
259: PV = 0x18e914c "\304\203"\0 [UTF8 "\x{103}"]
238: PV = 0x18e914c "\356"\0
or
259: PV = 0x18e914c "\304\203"\0 [UTF8 "\x{103}"]
238: PV = 0x18ecffc "\303\256"\0 [UTF8 "\x{ee}"]
The data is in Perl's internal text format (called "UTF8", no dash). It can either be in iso-latin-1 or UTF-8. iso-latin-1 is preferred since it's faster, but it can only be used if every character in the string can be represented by iso-latin-1.
Solution: You need to convert from Perl's internal format to a string of bytes.
use Encode qw( encode );
print(encode('UTF-8', $text));
or
binmode(STDOUT, ':encoding(UTF-8)');
print($text);
-
259: PV = 0x18d73fc "?"\0
238: PV = 0x18d7444 "\356"\0
The data is in iso-latin-1. This can't be the case, since "ă" is working.
-
259: PV = 0x18d736c "\304\203"\0
238: PV = 0x18ecffc "\303\256"\0
The data is in UTF-8 already. Just print it out without re-encoding it.
-
259: PV = 0x18d74dc "\304\203"\0 <- Lack of [UTF8 ...]
238: PV = 0x18d74dc "\356"\0
That means the data in your database is bad, or your database is returning bad data.
The problem should be fixed at the source, but I think it's possible to fix it at this point too.
Update: Added second pair of output combinations, and fixed s/utf8/utf-8/
|