2010-12-31 8 views
5

इस आउटपुट में, गैर-ASCII यूनिकोड वर्णों को मुद्रित करने के बाद मुझे अतिरिक्त न्यूलाइन क्यों मिल रही हैं?पर्ल यूनिकोड गड़बड़

प्लेटफार्म विंडोज विस्टा और समस्या के बाद chcp 65001 नहीं बल्कि chcp 850

 
C:\>chcp 850 
Active code page: 850 

C:\>perl unicode_bug_1.pl 
Budweiser 
Budweiser 
Budweiser 
Bud─øjovick├¢ Budvar 
Bud─øjovick├¢ Budvar 
Bud─øjovick├¢ Budvar 

C:\>chcp 65001 
Active code page: 65001 

C:\>perl unicode_bug_1.pl 
Budweiser 
Budweiser 
Budweiser 
Budějovický Budvar 

Budějovický Budvar 

Budějovický Budvar 

के बाद इस कार्यक्रम

#!perl 
use strict; 
use warnings; 

binmode (STDOUT, "encoding(UTF-8)"); # so no "Wide character in print" warning 

print "Budweiser\n" for 1..3; 
print "Bud\N{U+011B}jovick\N{U+00FD} Budvar\n" for 1..3; 
+2

कोई विचार नहीं; मेरे लिए नहीं हो रहा है। क्या आप हमें पर्यावरण के बारे में कुछ बता सकते हैं जहां आप इसे चला रहे हैं? – ysth

उत्तर

3

यह पर्ल में एक बग प्रतीत होता है। मैंने सोचा था कि यह विंडोज कोड पेज 65001 में वास्तव में कंसोल के लिए समर्थित नहीं है, लेकिन अंत में मैंने सी और पर्ल में परीक्षण कार्यक्रम किए हैं और समस्या सी संस्करण में नहीं होती है। यह कोई फर्क नहीं पड़ता कि यूनिकोड चरित्र रेखा में कहां होता है लेकिन जिस लाइन को आप प्रिंट कर रहे हैं वह कंसोल समर्थन से व्यापक होना चाहिए। यहाँ

#include "stdafx.h" 

#include "Windows.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    BOOL b = SetConsoleOutputCP(65001); 
    printf("set console output codepage returned %d\n", b); 

    printf("cαfe\n"); 
    printf("1234567890 café\n"); 
    printf("1234567890 1234567890 cαfe\n"); 
    printf("1234567890 1234567890 1234567890 café\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 cαfe\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); 
    printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); 

    return 0; 
}

और मेरे पर्ल कार्यक्रम है:

यहाँ मेरी सी कार्यक्रम है

# 

use utf8; 

binmode STDOUT, ':utf8'; 

printf STDOUT "cαfe\n"; 
printf STDOUT "1234567890 café\n"; 
printf STDOUT "1234567890 1234567890 cαfe\n"; 
printf STDOUT "1234567890 1234567890 1234567890 café\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 cαfe\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; 
printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n";

अद्यतन

नहीं मैं गलत था, में से कुछ की मदद से irc.perl.org पर #perl पर लोग माइक्रोसॉफ्ट एपीआई में एक बग बन जाते हैं। WriteFile को बाइट्स की संख्या वापस करने के लिए दस्तावेज किया गया है, लेकिन वर्ण लिखा गया है, जो कोडपृष्ठ पर निर्भर करता है। A bug was filed in March 2010

और चर्चा in the MSDN forums है।

अद्यतन 2

मैं माइकल कापलान के ब्लॉग, "Sorting it all out" पोस्ट, इस समस्या के बारे और वह लेख "Hidden in plain site: a purloined letter kind of a bug report" हकदार साथ जवाब दिया। वह एक माइक्रोसॉफ्ट अंतर्राष्ट्रीयकरण विशेषज्ञ है, इसलिए आपको निश्चित रूप से कुछ अंतर्दृष्टि मिल जाएगी ...

0

से मैं किसी भी नई-पंक्तियों नहीं मिल रहा है होता है। क्या आपकी कमांड लाइन आपके आउटपुट को फिट करने के लिए पर्याप्त है?

+0

मेरी कमांड लाइन काफी व्यापक है लेकिन मैंने देखा है कि समस्या तब नहीं होती है जब मैं कोड पृष्ठ को 'chcp 850' का उपयोग करके 850 पर सेट करता हूं - हालांकि तब वर्ण सभी ठीक से प्रदर्शित नहीं होते हैं। विंडोज विस्टा 32-बिट, सक्रियस्टेट पर्ल 5.10.0 MSWin32-x86-multi-thread। – RedGrittyBrick

+0

यहां chcp आउटपुट: 9 32. कोशिश करो, शायद? – Hugmeir

+0

@RedGrittyBrick, मुझे Windows Vista 64-बिट, सक्रियस्टेट पर्ल 5.10.1 MSWin32-x86-multi-thread पर वर्णित समस्या दिखाई नहीं दे रही है। शायद अपने पर्ल इंस्टॉल को अपग्रेड करने का प्रयास करें। –

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