Perl文本::CSV_XS编码问题
我在Perl中遇到Unicode字符的问题。当我从网上收到数据时,我经常会得到像Perl文本::CSV_XS编码问题,perl,excel,unicode,character-encoding,Perl,Excel,Unicode,Character Encoding,我在Perl中遇到Unicode字符的问题。当我从网上收到数据时,我经常会得到像√ú或√/code>。第一个是引号,第二个是欧元符号 现在我可以很容易地在Perl中替换正确的值,并将正确的单词打印到屏幕上,但是当我尝试输出到.CSV文件时,我所做的所有替换都是徒劳的,并且我在.CSV文件中得到了垃圾。(引用很有效,因为这是一个普通的字符)。纳梅罗也会给纳梅罗一个机会。例子不胜枚举 我写了一个小程序试图解决这个问题,但不确定问题出在哪里。我在另一个堆栈溢出线程上读到,您可以在Excel中导入.CS
√ú
或√/code>。第一个是引号,第二个是欧元符号
现在我可以很容易地在Perl中替换正确的值,并将正确的单词打印到屏幕上,但是当我尝试输出到.CSV文件时,我所做的所有替换都是徒劳的,并且我在.CSV文件中得到了垃圾。(引用很有效,因为这是一个普通的字符)。纳梅罗也会给纳梅罗一个机会。例子不胜枚举
我写了一个小程序试图解决这个问题,但不确定问题出在哪里。我在另一个堆栈溢出线程上读到,您可以在Excel中导入.CSV并选择UTF8编码,但我不会弹出此选项。我想知道我是否可以将它编码成Excel的原生字符集(UTF16BE???),或者是否有其他解决方案。我在这个简短的程序上尝试了许多变体,我要再次指出,它只是为了测试Unicode问题,而不是合法程序的一部分。谢谢
use strict;
use warnings;
require Text::CSV_XS;
use Encode qw/encode decode/;
my $text = 'Numéro Numéro Numéro Orkos Capital SAS (√¢¬Ä¬úOrkos√¢¬Ä¬ù) 325M√¢¬Ç¬¨ in 40 companies headquartered';
print("$text\n\n\n");
$text =~ s/“|”/"/sig;
$text =~ s/’s/'s/sig;
$text =~ s/√¢¬Ç¬¨/€/sig;
$text =~ s/√¢¬Ñ¬¢/®/sig;
$text =~ s/ / /sig;
print("$text\n\n\n");
my $CSV = Text::CSV_XS->new ({ binary => 1, eol => "\n" }) or die "Cannot use CSV: ".Text::CSV->error_diag();
open my $OUTPUT, ">:encoding(utf8)", "unicode.csv" or die "unicode.csv: $!";
my @row = ($text);
$CSV->print($OUTPUT, \@row);
$OUTPUT->autoflush(1);
我也试过这两行,但都没有用:
$text = decode("Guess", $text);
$text = encode("UTF-16BE", $text);
首先,字符串在MacRoman
中编码。当您将它们解释为字节序列时,第二个结果是c3a2c82c2ac
。这看起来像UTF-8,解码的形式是e282 AC
。这看起来又像UTF-8,当您解码它时,您会得到€
。因此,您需要做的是:
$step1 = decode("MacRoman", $text);
$step2 = decode("UTF-8", $step1);
$step3 = decode("UTF-8", $step2);
不要问我这种编码最初是以什么神秘的方式产生的。您的第一个字符解码为U+201C
,它实际上是左双引号
注意:如果您在Mac电脑上,第一个解码步骤可能是不必要的,因为编码只在“表示层”(当您将Perl源代码复制到HTML表单中,浏览器为您进行编码翻译时),而不在数据本身中。因此我找到了答案,罗兰·伊利格的评论帮助我实现了这一点(再次感谢!)多次解码会导致宽字符错误,因此不应执行此操作
这里的关键是对UTF-8文本进行解码,然后用MacRoman对其进行编码。要将.CSV文件发送给我的Windows朋友,我必须先将其保存为.XLSX,这样编码就不会再次出错
$text =~ s/“|”/"/sig;
$text =~ s/’s/'s/sig;
$text =~ s/√¢¬Ç¬¨/€/sig;
$text =~ s/√¢¬Ñ¬¢/®/sig;
$text =~ s/ / /sig;
$text = decode("UTF-8", $text);
print("$text\n\n\n");
my $CSV = Text::CSV_XS->new ({ binary => 1, eol => "\n" }) or die "Cannot use CSV: ".Text::CSV->error_diag();
open my $OUTPUT, ">:encoding(MacRoman)", "unicode.csv" or die "unicode.csv: $!";
$text=~s/√¢¬Ä¬ú|√、、、、、“/”/sig;
$text=~s/√、、s/、s/sig;
$text=~s/√/€/sig;
$text=~s/√//sig;
$text=~s/√∗†//sig;
$text=解码(“UTF-8”,$text);
打印($text\n\n\n);
我的$CSV=Text::CSV_XS->new({binary=>1,eol=>“\n”})或die“无法使用CSV:”.Text::CSV->error_diag();
打开我的$OUTPUT“>:encoding(MacRoman)”、“unicode.csv”或“unicode.csv:$!”;
当我尝试这样做时,我得到以下错误:无法在/Library/Perl/Updates/5.10.0/darwin-thread-multi-2level/Encode.pm第174行解码带有宽字符的字符串。“宽字符”是什么意思?我也在Mac上。通常,当你解码某个东西时,你从字节序列转换为字符序列。“宽字符”是什么意思“错误消息告诉您已经有了一个字符序列。这是一个安全网,可以防止您做通常不想做的事情。如果您将Perl程序保存为UTF-8而不是MacRoman编码,可能会有所帮助。或者您已经这样做了吗?”?