在64位系统上使用perl的小写特殊字符

时间:2017-01-06 16:58:36

标签: regex perl

我想处理一个文本文件,其中包含一长串具有以下形式的句子:

<s>  Hello world  </s>
<s>  Ça world  </s>
<s>  He llo world  </s>
<s>  H.E.L.L.O world  </s>

我想使用Perl(5.22.1)小写每个句子的第一个单词的第一个字母(“Hello” - &gt;“hello”)。我也不想修改缩写(例如A.B.C.)。 我的问题是文件可能包含特殊字符(例如Ç),我认为它们的编码给Perl带来了困难。

该文件采用ISO-8859-1编码。这是我使用的代码:

use strict;
use warnings;
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "fr_CA.ISO-8859-1");

while (<STDIN>) {

  s/(^<s> +)(\w[^\.\ ][^\ ]*)/
    $1.lc($2)
  /ge;

  print;
}

如果我在cygwin上处理带有该代码的文件(windows 64 -bit),我得到的结果是:

<s>  hello world  </s>
<s>  Ça world  </s>
<s>  he llo world  </s>
<s>  H.E.L.L.O world  </s>

“Ç”字符仍然是大写字母。

如果我在cygwin上处理它(windows 32 -bit),我得到的结果是:

<s>  hello world  </s>
<s>  ça world  </s>
<s>  he llo world  </s>
<s>  H.E.L.L.O world  </s>

“Ç”字符现在是小写的。

我希望代码可以在32位和64位窗口上运行 - 并理解它为什么不能正常工作。

1 个答案:

答案 0 :(得分:3)

您还需要指定输入和输出的编码。

use open IO => ':encoding(iso-8859-1)', ':std';

您也可以使用

use open IO => ':locale', ':std';

但在这种情况下,您需要在设置open图层之前在BEGIN块中设置区域设置:

BEGIN { setlocale(LC_CTYPE, "fr_CA.ISO-8859-1"); }