لماذا يعطيني Perl's LWP ترميزًا مختلفًا عن الموقع الأصلي؟

StackOverflow https://stackoverflow.com/questions/2341128

سؤال

دعنا نقول لدي هذا الرمز:

use strict;
use LWP qw ( get );

my $content = get ( "http://www.msn.co.il" );

print STDERR $content;

يعرض سجل الخطأ شيئًا مثل " xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94" الذي أظن أنه UTF-16؟

ترميز الموقع مع

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1255">

فلماذا تظهر هذه الأحرف وليس Windows-1255 chars؟

وشيء غريب آخر هو أن لدي خادمان:

الخادم الأول الذي يعيد CP1255 chars ويمكنني ببساطة تحويله إلى UTF8 ، والخادم الحالي يعطيني هذه المشاريع ولا يمكنني فعل أي شيء معها ...

هل هناك أي ملف تكوين في Apache/Perl/الوحدة النمطية التي تعبث الترميز؟ إجبار شيء ...؟

النتيجة في موقع الويب الخاص بي في الخادم الثاني ، هي أن ملف Perl والرؤوس كلها UTF8 ، لذلك عندما أكتب نصًا ليس chars الإنجليزية ، فإن المحتوى من المثال أعلاه يظهر موافق (على الرغم من أنه غريب uTF chars ) لكن النص الثابت الخاص بي يشبه "× ¡'× × ¨ ¨ × ×:"

شيء آخر اختبرته هو ...

من خلال بيرل:

my $content = `curl "http://www.anglo-saxon.co.il"`;    

أحصل على ترميز UTF8.

من خلال باش:

curl "http://www.anglo-saxon.co.il"

وهنا أحصل على ترميز CP1255 (Windows-1255) ...

أيضًا ، عندما أقوم بتشغيل البرنامج النصي في Bash - يعطي CP1255 ، وعند تشغيله عبر الويب - ثم يكون UTF8 مرة أخرى ...

تم إصلاح المشكلة عن طريق Changin المحتوى من UTF8 - إلى ما يفترض ، ثم العودة إلى UTF8:

use Text::Iconv;

my $converter = Text::Iconv->new("utf8", "CP1255");
   $content=$converter->convert($content);

my $converter = Text::Iconv->new("CP1255", "utf8");
   $content=$converter->convert($content);
هل كانت مفيدة؟

المحلول

يبدو أن السلسلة التي تحتوي على قيم Hex التي قدمتها لتشفير UTF-8. أنت تحصل على هذا لأن Perl "يحب" استخدام UTF-8 عندما يتعامل مع الأوتار. ال LWP::Simple->get() تقوم الطريقة تلقائيًا بفك تشفير المحتوى من الخادم الذي يتضمن التراجع عن أي ترميز للمحتوى وكذلك التحويل إلى UTF-8.

يمكنك البحث في الداخلية والحصول على إصدار يغير تشفير الأحرف (انظر http :: message's decoded_content, الذي يستخدمه http :: decoded_content استجابة, ، والتي يمكنك الحصول عليها LWP :: get useragent's). ولكن قد يكون من الأسهل إعادة ترميز البيانات في الترميز المطلوب بشيء مثل

use Encode; 
...; 
$cp1255_bytes = encode('CP1255', decode('UTF_8', $utf8_bytes));

ترجع أحرف القراءة/القمامة المختلطة التي تراها إلى خلط الترميزات المتعددة غير المتوافقة في نفس الدفق. من المحتمل أن يتم تصنيف الدفق على أنه UTF-8 ولكنك تضع أحرفًا مشفرة CP1255 فيه. تحتاج إما إلى تسمية الدفق على أنه CP1255 ووضع البيانات المشفرة CP1255 فقط فيه ، أو تسميته على أنه UTF-8 ووضع بيانات UTF-8 فقط فيها. ذكّر نفسك بأن البايتات ليست أحرفًا وأن تتحول بينها بشكل مناسب.

نصائح أخرى

فقط للتأكد، حاول الحصول على القيم من الحدث .ربما السبب في أن القيم غير متوفرة هي لأنها غير موجودة بعد.

http://www.msn.co.il في UTF-8 ، ويشير إلى ذلك بشكل صحيح. The string "xd7x9cxd7x94xd7x93xd7xa4xd7xa1xd7x94" is also proper UTF-8 (להדפסה). أنا لا أرى المشكلة.

أعتقد أن مشكلتك الثانية ترجع إلى خلط الترميزات المختلفة (UTF-8 و Windows-1252). قد ترغب في ذلك تشفير/فك شفرة سلاسلك بشكل صحيح.

أولاً ، لاحظ أنه يجب عليك الاستيراد get من LWP :: بسيط. ثانياً ، كل شيء يعمل بشكل جيد مع:

#!/usr/bin/perl
use strict; use warnings;
use LWP::Simple qw ( getstore );
getstore 'http://www.msn.co.il', 'test.html';

مما يشير لي إلى أن المشكلة هي ترميز FileHandle الذي ترسل إليه الإخراج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top