2009-08-25 10 views
11

length() के लिए perldoc पृष्ठ मुझे बताता है कि मुझे बाइट्स में यूनिकोड स्ट्रिंग खोजने के लिए bytes::length(EXPR) का उपयोग करना चाहिए, या bytes पृष्ठ इसे इकोज़ करता है।पर्ल में यूनिकोड स्ट्रिंग की लंबाई मुझे कैसे मिल सकती है?

ASCII: 26 
ASCII bytes: 26 
Unicode: 35 
Unicode bytes: 35 

ऐसा लगता है मेरे लिए लंबाई() और बाइट्स :: लंबाई() दोनों ASCII & यूनिकोड तार के लिए एक ही लौट:

use bytes; 
$ascii = 'Lorem ipsum dolor sit amet'; 
$unicode = 'Lørëm ípsüm dölör sît åmét'; 

print "ASCII: " . length($ascii) . "\n"; 
print "ASCII bytes: " . bytes::length($ascii) . "\n"; 
print "Unicode: " . length($unicode) . "\n"; 
print "Unicode bytes: " . bytes::length($unicode) . "\n"; 

इस स्क्रिप्ट के उत्पादन में, हालांकि, मैनपेज से सहमत नहीं । मेरे संपादक ने डिफ़ॉल्ट रूप से फ़ाइलों को यूटीएफ -8 के रूप में लिखने के लिए सेट किया है, इसलिए मुझे लगता है कि पर्ल पूरी स्क्रिप्ट को यूनिकोड के रूप में व्याख्या कर रहा है-क्या इसका मतलब है लंबाई() स्वचालित रूप से यूनिकोड स्ट्रिंग को सही तरीके से संभालती है?

संपादित करें: मेरी टिप्पणी देखें; मेरा प्रश्न पूरी तरह से समझ में नहीं आता है, क्योंकि लंबाई() उपर्युक्त उदाहरण में "ठीक से" काम नहीं कर रहा है - यह बाइट्स में यूनिकोड स्ट्रिंग की लंबाई दिखा रहा है, वर्णों में नहीं। जिस मूल रूप से मैं मूल रूप से इस पर ठोकर खा रहा हूं वह एक प्रोग्राम के लिए है जिसमें मुझे एक HTTP संदेश में सामग्री-दसवीं शीर्षलेख (बाइट्स में) सेट करने की आवश्यकता है। मैंने पर्ल में यूनिकोड पर पढ़ा था और चीजों को काम करने के लिए कुछ फंतासी करने की उम्मीद थी, लेकिन जब लंबाई() ने बिल्कुल ठीक किया जो मुझे बल्ले के अधिकार की ज़रूरत थी, तो मैं उलझन में था! use utf8, use bytes, और no bytes पर पर्ल में एक सिंहावलोकन के लिए स्वीकृत उत्तर देखें।

+0

मुझे नहीं लगता कि आप क्यों कहते हैं कि लंबाई() यूनिकोड स्ट्रिंग को ठीक से संभालती है। आपके उदाहरण की लंबाई() में बाइट्स :: लंबाई() के समान परिणाम मिलता है, यह बाइट्स की संख्या है, न कि वर्णों की संख्या (जो उचित होगा)। – Inshallah

+0

दूसरे शब्दों में, लंबाई ($ यूनिकोड) स्ट्रिंग को ASCII के रूप में व्याख्या कर रही है, न कि यूनिकोड के रूप में। – Inshallah

+0

आप बिल्कुल सही हैं! मैंने इस तथ्य को पूरी तरह से अनदेखा कर दिया था- मेरे प्रोग्राम में, मैं एक HTTP संदेश में सामग्री-लंबाई शीर्षलेख सेट करने के लिए लंबाई() का उपयोग कर रहा हूं, जिसे बाइट्स में होना आवश्यक है। लम्बाई() दस्तावेज़ पढ़ने के बाद, मैं उस फ़ंक्शन को कुछ गलत करने की उम्मीद कर रहा था, लेकिन वास्तव में यह वास्तव में वही है जब मैं चाहता हूं कि पर्ल 'बाइट्स मोड' मोड में है: अक्षरों की बजाय बाइट्स में यूनिकोड स्ट्रिंग की लंबाई। –

उत्तर

21

यदि आपकी स्क्रिप्ट यूटीएफ -8 में एन्कोड किए गए हैं, तो कृपया utf8 pragma का उपयोग करें। दूसरी ओर bytes pragma लंबाई पर बाइट अर्थशास्त्र को मजबूर करेगा, भले ही स्ट्रिंग यूटीएफ -8 है। दोनों वर्तमान शब्दावली के क्षेत्र में काम करते हैं।

$ascii = 'Lorem ipsum dolor sit amet'; 
{ 
    use utf8; 
    $unicode = 'Lørëm ípsüm dölör sît åmét'; 
} 
$not_unicode = 'Lørëm ípsüm dölör sît åmét'; 

no bytes; # default, can be omitted 
print "Character semantics:\n"; 

print "ASCII: ", length($ascii), "\n"; 
print "Unicode: ", length($unicode), "\n"; 
print "Not-Unicode: ", length($not_unicode), "\n"; 

print "----\n"; 

use bytes; 
print "Byte semantics:\n"; 

print "ASCII: ", length($ascii), "\n"; 
print "Unicode: ", length($unicode), "\n"; 
print "Not-Unicode: ", length($not_unicode), "\n"; 

यह आउटपुट:

Character semantics: 
ASCII: 26 
Unicode: 26 
Not-Unicode: 35 
---- 
Byte semantics: 
ASCII: 26 
Unicode: 35 
Not-Unicode: 35 
4

bytes pragma के प्रयोजन के वर्तमान क्षेत्र में length समारोह (और कई अन्य स्ट्रिंग संबंधित कार्यों) को बदलने के लिए है। तो आपके कार्यक्रम में length पर प्रत्येक कॉल length पर कॉल है जो bytes प्रदान करता है। यह तुम क्या करने की कोशिश कर रहे थे के साथ लाइन में अधिक है:

#!/usr/bin/perl 

use strict; 
use warnings; 

sub bytes($) { 
    use bytes; 
    return length shift; 
} 

my $ascii = "foo"; #really UTF-8, but everything is in the ASCII range 
my $utf8 = "\x{24d5}\x{24de}\x{24de}"; 

print "[$ascii] characters: ", length $ascii, "\n", 
    "[$ascii] bytes  : ", bytes $ascii, "\n", 
    "[$utf8] characters: ", length $utf8, "\n", 
    "[$utf8] bytes  : ", bytes $utf8, "\n"; 

एक और सूक्ष्म दोष अपने तर्क में यूनिकोड बाइट के रूप में ऐसी बात नहीं है कि है। यूनिकोड वर्णों की गणना है। यह कहता है, उदाहरण के लिए, यू + 24 डी 5 & # x24d5 (सर्कल लेटिन छोटे पत्र एफ) है; यूनिकोड क्या निर्दिष्ट नहीं करता है कि चरित्र कितने बाइट्स लेता है। यह एन्कोडिंग के लिए छोड़ दिया गया है। यूटीएफ -8 का कहना है कि इसमें 3 बाइट्स लगते हैं, यूटीएफ -16 का कहना है कि इसमें 2 बाइट्स लगते हैं, यूटीएफ -32 का कहना है कि इसमें 4 बाइट्स इत्यादि लगते हैं। यहां comparison of Unicode encodings है। पर्ल डिफ़ॉल्ट रूप से अपने तारों के लिए यूटीएफ -8 का उपयोग करता है। यूटीएफ -8 को पहले 127 पात्रों के लिए ASCII के हर तरह से समान होने का लाभ है।

1

मुझे पता चला कि लंबाई कैसे काम करता है यह प्रभावित करने के लिए एनकोड मॉड्यूल का उपयोग करना संभव है।

यदि $ स्ट्रिंग utf8 एन्कोडेड स्ट्रिंग है।

एनकोड :: _ utf8_on ($ string); # लंबाई समारोह इसके बाद कोड बिंदुओं की संख्या दिखाएगा।

एनकोड :: _ utf8_off ($ string); # लम्बाई फ़ंक्शन इसके बाद स्ट्रिंग में बाइट्स की संख्या दिखाएगा।

संबंधित मुद्दे