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/9/google-apps-script/6.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-将utf-8字符转换为连字符-将utf-8作为单个字符读取_Perl_Utf 8_Ascii_Non Ascii Characters - Fatal编程技术网

Perl-将utf-8字符转换为连字符-将utf-8作为单个字符读取

Perl-将utf-8字符转换为连字符-将utf-8作为单个字符读取,perl,utf-8,ascii,non-ascii-characters,Perl,Utf 8,Ascii,Non Ascii Characters,我是perl新手。我需要将字符串中的UTF-8字符转换为连字符(-) 但我编写的下面的程序将UTF-8字符作为两个单独的字节读取,并将输出作为“10--at--25--Disco” 但这个特殊的第四个字符串列只有14个字符的固定长度,所以额外的连字符会造成问题 有人能给我一些关于如何将UTF-8字符作为单个字符读取的线索吗?您需要的主要内容是perl-CSD。有了它,脚本就可以像 perl -CSD -pe 's/[^\x00-\x7F]/-/g' 有关选项的讨论,请参阅;但简而言之,-CS意

我是perl新手。我需要将字符串中的UTF-8字符转换为连字符(-)

但我编写的下面的程序将UTF-8字符作为两个单独的字节读取,并将输出作为“10--at--25--Disco”

但这个特殊的第四个字符串列只有14个字符的固定长度,所以额外的连字符会造成问题


有人能给我一些关于如何将UTF-8字符作为单个字符读取的线索吗?

您需要的主要内容是
perl-CSD
。有了它,脚本就可以像

perl -CSD -pe 's/[^\x00-\x7F]/-/g'

有关选项的讨论,请参阅;但简而言之,
-CS
意味着
STDIN
STDOUT
STDERR
在UTF-8中;而
-CD
意味着UTF-8是输入和输出流的默认PerlIO层。(此脚本仅使用
STDIN
STDOUT
,因此
D
不是绝对必要的;但是如果您只学习了一种魔法咒语,请学习
-CSD

谢谢它的使用。你的一行代码也很有用。我今天在perl中学到了一些新东西:)
使用open:std',':encoding(UTF-8)
[root@ cdr]# cat ../asciifilter.pl
#!/usr/bin/perl
use strict;
use Encode;
my @chars;
my $character;
my $num;
while(my $row = <>) {
  @chars = split(//,$row);

  foreach $character (@chars) {
    $num  = ord($character);
    if($num < 127) { 
      print $character;
    } else { 
      print "-";
    }
  }
}
  [root@MAVBGL-351L cdr]# echo "IVM IST   20150324095652 31610150096     10ÑatÑ25ÑDisco 0000000091" | ../asciifilter.pl
  IVM IST   20150324095652 31610150096     10--at--25--Disco 0000000091
perl -CSD -pe 's/[^\x00-\x7F]/-/g'