পার্ল থেকে আমি কীভাবে ইউটিএফ -8 আউটপুট করতে পারি?


110

আমি "utf8" প্রগমা ব্যবহার করে পার্ল স্ক্রিপ্ট লেখার চেষ্টা করছি এবং আমি অপ্রত্যাশিত ফলাফল পাচ্ছি। আমি ম্যাক ওএস এক্স 10.5 (চিতাবাঘ) ব্যবহার করছি এবং আমি টেক্সটমেট দিয়ে সম্পাদনা করছি। আমার সম্পাদক এবং অপারেটিং সিস্টেম উভয়ের জন্য আমার সমস্ত সেটিংস utf-8 ফর্ম্যাটে ফাইল লেখার ক্ষেত্রে ডিফল্ট হয়েছে।

যাইহোক, আমি যখন কোনও পাঠ্য ফাইলে নিম্নলিখিতটি প্রবেশ করি, এটিকে ".pl" হিসাবে সংরক্ষণ করুন এবং এটি সম্পাদন করি, তখন আমি নন-এএসসিআইআই অক্ষরগুলির পরিবর্তে বন্ধুত্বপূর্ণ "প্রশ্ন চিহ্নযুক্ত হীরা" পাই।

#!/usr/bin/env perl -w

use strict;
use utf8;

my $str = 'Çirçös';
print( "$str\n" );

আমি কি ভুল করছি কোন ধারণা? আমি আউটপুট 'ÇirÇs' পেতে আশা করি, কিন্তু আমি পরিবর্তে ''ir s' পেতে।


1
সম্ভবত এটি প্রোগ্রাম নয় .. আমি মনে করি এটি আপনার শেলটি আপনার সম্পাদককে আরও খারাপ করে দেয় যা আউটপুটটি করে
n00ki3

সমস্ত উত্তর সঠিকভাবে আপনার প্রশ্নটিকে ইউটিএফ 8 এ সেট করবেন কীভাবে আপনার প্রশ্নের সঠিক উত্তর দেয়। আমার মনে হয় আপনি স্ট্যাকওভারফ্লো . com/a/14405949/498634 তে দেখানো হিসাবে আপনার টার্মিনালের লোকেল সেটিংসের সাথে সামঞ্জস্য করা উচিত । টার্মিনালটি ইউটিএফ 8 এ সেট নাও করা যেতে পারে এবং তারপরে ইউটিএফ 8-তে এসটিডিআউটে লিখিত ডেটা ভুলভাবে এনকোড হবে !
ড্যানিয়েল বোহমার

কীভাবে কাজ করবেন তার দুর্দান্ত উত্তরutf8 :
ইউজেন কনকভ

উত্তর:


160

use utf8;ইউনিকোড আউটপুট সক্ষম করে না - এটি আপনাকে আপনার প্রোগ্রামে ইউনিকোড টাইপ করতে সক্ষম করে। আপনার print()বক্তব্যের আগে, প্রোগ্রামটিতে এটি যুক্ত করুন :

binmode(STDOUT, ":utf8");

এটি সাহায্য করে কিনা দেখুন। এটি STDOUTসাধারণ ASCII এর পরিবর্তে ইউটিএফ -8 এ আউটপুট তৈরি করা উচিত ।


আমি এই সম্পর্কে জানতাম না (আমি কেবল একটি ডাটাবেসে ইউটিএফ 8 রেখেছি, এটি কখনই মুদ্রণ করি না)। +1 টি।
পল টমলিন

1
আপনাকে স্বাগতম. আরও দেখুন অন্য সঠিক উত্তর: stackoverflow.com/questions/627661/writing-perl-code-in-utf8/... এবং মনে রাখবেন, TMTOWTDI। এবং @ পল - আপনি যদি কোনও ফাইলে ইউটিএফ -8 লিখছেন তবে আপনার সম্ভবত সেই ফাইলহ্যান্ডেলে বিনমোড () ব্যবহার করা উচিত এবং এটি "যথাযথ" ইউটিএফ -8 করা উচিত, তবে যদি এটি কার্যকর হয় ..
ক্রিস লুটজ

1
অন্যান্য উপায়ে: ওপেন প্রগমা ( search.cpan.org/perldoc/open ), -সি স্যুইচ ( perldoc.perl.org/perlrun.html#-C )
ইয়াস

1
এখানে এফডব্লিউআইডাব্লু এর কারণ: স্ট্রিংগুলিতে কেবল ইউটিএফ 8-তে কম-বেশি সঞ্চিত থাকা সত্ত্বেও ল্যাটিন 1 (আইএসও -8859-1) অক্ষর রয়েছে, ডিফল্টভাবে ল্যাটিন 1 হিসাবে আউটপুট হবে। প্রাক-ইউনিকোড যুগের এই স্ক্রিপ্টগুলি এখনও ইউনিকোড-সচেতন পার্ল সহ একই কাজ করে।
মিরোড

3
ইউটিএফ 8 প্রগমা আপনাকে ইউনিকোডে আপনার উত্স লিখতে দেয় না, এটি ইউনিকোডির ইউটিএফ -8 (বা ইউটিএফ-ইবিসিডিআইসি) এনকোডিংয়ে আপনার উত্সটি বোঝার জন্য জোর করে, এটি একটি গুরুত্বপূর্ণ পার্থক্য।
চস ওয়েন্স

83

আপনি ওপেন প্রাগমা ব্যবহার করতে পারেন ।

যেমন যেমন ইউটিএফ -8 ব্যবহার করতে নীচে STDOUT, STDIN এবং STDERR সেট করে ...

use open qw/:std :utf8/;

1
বিটিডাব্লু ... আমি আপনাকে +1 দিয়েছি। আমি মনে করি বিনমোড (STDOUT, ': utf8') এই পরিস্থিতিতে সম্ভবত আরও সঠিক। "ওপেন ইউজ করুন" এর অন্যান্য ভাল ব্যবহার রয়েছে তবে আমি কেবল এটি STDOUT এনকোড করার জন্য কীভাবে সেট করতে পারি তা খুঁজে পাচ্ছি না?
draegtun

66

টিএমটিওটিডিআই , এমন পদ্ধতি বেছে নিয়েছে যা আপনার কাজকে সর্বাধিক ফিট করে। আমি পরিবেশ পদ্ধতিটি ব্যবহার করি তাই আমাকে এটি সম্পর্কে ভাবতে হবে না।

ইন পরিবেশ :

export PERL_UNICODE=SDL

উপর কমান্ড লাইন :

perl -CSDL -le 'print "\x{1815}"';

বা বিনমোড সহ :

binmode(STDOUT, ":utf8");          #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8

বা পার্লিও সহ :

open my $fh, ">:utf8", $filename
    or die "could not open $filename: $!\n";

open my $fh, "<:encoding(utf-8)", $filename
    or die "could not open $filename: $!\n";

বা উন্মুক্ত প্রগমা সহ :

use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";

1
একটি বিস্তৃত উত্তরের জন্য +1; নোট যে SDLউভয় -Cএবং সঙ্গে জড়িত হয় PERL_UNICODEuse open ':locale'Pragma এছাড়াও মূল্য উল্লেখ করা হয়েছে কারণ এটি সমতুল্য ইন-স্ক্রিপ্ট হয় -Cএবং export PER_UNICODE=। এই 3 এর যে কোনওটি আপনাকে সমস্ত ইনপুট এবং আউটপুট স্ট্রিমের জন্য ফাইলগুলি (ফাইল বা স্টিডিন / স্টাডআউট / স্টার্ডার কিনা) দেবে, আপনার পরিবেশের স্থানীয় অবস্থানটি ইউটিএফ 8 ভিত্তিক বলে ধরে নিবে। অবশেষে, উত্সuse utf8; কোডটিকে ইউটিএফ 8 হিসাবেও বিবেচনা করতে, প্রগমাটি ব্যবহার করুন ।
mklement0

perl -Mutf8 -CSDL -e '...'ইউটিএফ -8 খাওয়ার / আউটপুট দেওয়ার পাশাপাশি অভ্যন্তরে ইউটিএফ -8 লিটারেল ব্যবহার করতে দেয় -eযেমন দরিদ্র মানুষের ক্ষেত্রে ফোল্ডারের জন্য:perl -Mutf8 -CASDL -pe 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/'
ভ্লাদার


0

ধন্যবাদ, অবশেষে utf8 :: সমস্ত কোডে এনকোড না দেওয়ার সমাধান পেয়েছে। অন্যান্য ক্ষেত্রে যেমন সংশ্লেষ করা এবং সম্পূর্ণ করার জন্য, যেমন ইউটিএফ ৮-তে ফাইল লিখুন এবং পড়ুন এবং ইউএফএফ-এ কোনও ওয়াইএমএল ফাইলের লোডফাইলে কাজ করে

use utf8;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");

open(FH, ">test.txt"); 
print FH "something éá";

use YAML qw(LoadFile Dump);
my $PUBS = LoadFile("cache.yaml");
my $f = "2917";
my $ref = $PUBS->{$f};
print "$f \"".$ref->{name}."\" ". $ref->{primary_uri}." ";

যেখানে ক্যাশে.আইএমএল:

---
2917:
  id: 2917
  name: Semanário
  primary_uri: 2917.xml

-3

আপনার শেলটি করুন: v env | গ্রেপ LANG

এটি সম্ভবত দেখায় যে আপনার শেলটি utf-8 লোকেল ব্যবহার করছে না।


আসলে, এটি utf-8 এ সেট করা হয়েছিল। সমস্যাটি হ'ল আমি বিনডমোটটি utf-8 এ সেট না করেই STDOUT এ আউটপুট দিচ্ছি;

2
এটি একটি অরথোগোনাল উদ্বেগ হবে। আপনার টার্মিনাল এমুলেটর কীভাবে এটি ব্যাখ্যা করে তা নিয়ে চিন্তা করার আগে আপনার পার্ল স্ক্রিপ্টের সঠিক ডেটা আউটপুট নিতে হবে।
jrockway
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.