On Tue, 20 Nov 2001 16:35:25 -0000, in perl.unicode you wrote:
open(FICH1,"fich1.txt")||die"Nao foi possivel abrir o ficheiro fich1.txt";
open(FICH3,">fich3.txt")||die"Nao foi possivel abrir o ficheiro fich3.txt";
Good that you check for success, but you should also include the reason
-- it's in $!. For example:
open(FICH1, "fich1.txt") || die "Nao foi possivel abrir " .
"o ficheiro fich1.txt: $!";
use utf8;
You shouldn't need that. Unicode::String will do all the Unicodery for
you; your program only needs to handly 'plain' bytes.
while (<FICH1>) {
chomp($_);
$palavra1=$_;
@array=split(/ /,$palavra1);
What do you use $palavra1 and @array for? (And @array is usually a bad
variable name.)
$palavra2=utf16($_);
Here is a mistake. If you call utf16($_), it means "$_ is a string
encoded in UTF-16. Take it and convert it into a Unicode::String
object."
But you said you wanted to convert from UTF-8 to UTF-16. So you probably
want something like
$palavra_objeito = utf8($_);
$palavra_em_utf16 = $palavra_objeito->utf16;
Note that ->utf16 will return UTF-16BE, as I understand it, since
"Internally a Unicode::String object is a string of 2 byte values in
network byte order (big-endian)" (quote from the docs). So if your
database and/or file wants UTF-16LE (which is more natural for Intel
chips), then you need to do something such as
$palavra_objeito->byteswap;
first (after you assign to $palavra_objeito and before you call ->utf16)
to convert from big-endian to little-endian.
$sql = "INSERT INTO Tipo_Referencia ( Descricao ) SELECT '$palavra2'
AS Expr1;";
Is there a reason why you don't write this as
$sql = "INSERT INTO Tipo_Referencia ( Descricao ) " .
"VALUES ('$palavra_em_utf16')"
? The "INSERT INTO table (columns) VALUES (literals)" is, for me, the
usual syntax, and "INSERT INTO table (columns) SELECT literals AS dummy"
looks strange to me.
print FICH3 $palavra2,"\n";
$conn->execute($sql,,,adExecuteNoRecords);
This is the same as
$conn->execute($sql,adExecuteNoRecords);
.. If the constant adExecuteNoRecords has to be the fourth parameter to
->execute, then say so:
$conn->execute($sql, undef, undef, adExecuteNoRecords);
.. Perl isn't Visual Basic :)
To summarise, I think you have misunderstood how Unicode::String works.
utf16() (called as a function, not a method) doesn't convert a strong
*to* UTF-16, it expects a string in UTF-16 and converts *from* that
encoding into the internal format used by Unicode::String and returns an
object. Then you can call methods on that object to produce another
encoding such as UTF-8 or Latin-1 or whatever. So conversions involving
Unicode::String generally involve at least two calls.
Cheers,
Philip