Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl文本::CSV_XS编码问题_Perl_Excel_Unicode_Character Encoding - Fatal编程技术网

Perl文本::CSV_XS编码问题

Perl文本::CSV_XS编码问题,perl,excel,unicode,character-encoding,Perl,Excel,Unicode,Character Encoding,我在Perl中遇到Unicode字符的问题。当我从网上收到数据时,我经常会得到像√ú或√/code>。第一个是引号,第二个是欧元符号 现在我可以很容易地在Perl中替换正确的值,并将正确的单词打印到屏幕上,但是当我尝试输出到.CSV文件时,我所做的所有替换都是徒劳的,并且我在.CSV文件中得到了垃圾。(引用很有效,因为这是一个普通的字符)。纳梅罗也会给纳梅罗一个机会。例子不胜枚举 我写了一个小程序试图解决这个问题,但不确定问题出在哪里。我在另一个堆栈溢出线程上读到,您可以在Excel中导入.CS

我在Perl中遇到Unicode字符的问题。当我从网上收到数据时,我经常会得到像
√ú
√/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编码,可能会有所帮助。或者您已经这样做了吗?”?