无法在perl中使用cp1256

时间:2014-10-02 13:24:18

标签: perl

我有一个简单的单词来计算单词,它只计算英语单词而且看不到cp-1256中编码的阿拉伯语单词,这是我主要考虑的问题。我在Windows 8上工作 以下是该文件的示例:

文字إذااعتبرناجوجولوتشيكوفهمارئداالقصةفيالعالمفإننانعتبرالدكتوريوسفإدريسهوأميرالقصةالقصيرةلديالعربإذحققللقصةالقصيرةفيمصروالعالمالعربينقلةنوعيةمنحيثالبناءوالفكرةوالطرح,كانذلكبينأواخرالخمسينياتوطوالالستينياتورغمالتطورالنوعيالفارق الذيأحدثهفيمايتعلقبفكرةالتحديث, إلاأنقصصهكانتلصيقةبالحياةومتقاطعةمعقطاععظيممنالبشرالمهمشين,خاصةمنخلالمجموعاتهالقصصية«بيتمنلحم»و«لغةالأيآي»و«أرخصليالي»وقدولديوسفإدريس«زيالنهارده»منعام1927年في«البيروم» بمحافظةالشرقية。 وليوسفإدريسنحوعشرينمجموعةقصصيةوخمسرواياتكانمنها«الحرام»و«قاعالمدينة»«والنداهة»وكانتأعمالهالقصصيةقدترجمتللكثيرمناللغاتالأخريومنهانحو65قصةترجمتللروسية, وكانيوسفإدريسقدكتبللأهرامسلسلةمنالمقالاتالتيصدرتمجمعةمنكتابيحملعنوان«فقرالفكروفكرالفقر»وكانقدحصلعليجائزةالدولةالتشجيعيةعام1966, وقيلإناسمهكانمدرجاضمنالمرشحينلجائزةنوبلعام1988والتيحظيبهانجيبمحفوظ,وكانلهفيذلكهجومشهير。 وليوسفإدريسعددمنالمسرحياتكانمنها«الفرافير»و«المخططين»و«البهلوان»و«اللحظةالحرجة»و«المهزلةالأرضية»و«الجنسالثالث»。 文本

while (<>) {
    @words = split(/\W+/);
    foreach $word (@words) {
        $count{$word}++;
    }
}
foreach $word (sort by_count keys %count) {
     print "$word occurs $count{$word} times\n";
}
sub by_count {
    $count{$b} <=> $count{$a};
}

我有一个旧脚本,上面有这些并且工作正常,但现在它不是

use win32;
use POSIX 'locale_h';
use locale;

2 个答案:

答案 0 :(得分:4)

您应该设置输入流的编码。

use open IN => ':encoding(cp1256)';   # For "script file"
binmode STDIN, ':encoding(cp1256)';   # For "script <file"

如果您还想输出cp1256,可以用

替换上面的两个
use open ':std', ':encoding(cp1256)';   # All input and output

答案 1 :(得分:0)

仅仅为了知识我改变了print语句进行排序

foreach $word (sort by_count keys %count) {
printf "%5d \t %s\n", $count{$word}, $word;

感谢