python - अजगर 3 प्रिंट() फार्सी/अरबी पात्रों के साथ कार्य




python-3.x unicode (3)

आउटपुट मूल रूप से इस बात पर निर्भर करेगा कि आप किस कोड और टर्मिनल पर अपना कोड चलाते हैं। आइए 2.x या 3.x के साथ चलने वाली विभिन्न विंडो टर्मिनलों के लिए नीचे दिए गए स्निपेट की जांच करें:

# -*- coding: utf-8 -*-
import sys

def case1(text):
    print(text)

def case2(text):
    print(text.encode("utf-8"))

def case3(text):
    sys.stdout.buffer.write(text.encode("utf-8"))

if __name__ == "__main__":
    text = "چرا کار نمیکنی؟"

    for case in [case1, case2, case3]:
        try:
            print("Running {0}".format(case.__name__))
            case(text)
        except Exception as e:
            print(e)

        print('-'*80)

परिणाम

अजगर 2.x

Sublime Text 3 3122

    Running case1
    'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
    --------------------------------------------------------------------------------
    Running case2
    b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
    --------------------------------------------------------------------------------
    Running case3
    چرا کار نمیکنی؟--------------------------------------------------------------------------------

ConEmu v151205

    Running case1
    ┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ
    --------------------------------------------------------------------------------
    Running case2
    'ascii' codec can't decode byte 0xda in position 0: ordinal not in range(128)
    --------------------------------------------------------------------------------
    Running case3
    'file' object has no attribute 'buffer'
    --------------------------------------------------------------------------------

विंडोज कमांड प्रॉम्प्ट

    Running case1
    ┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ
    --------------------------------------------------------------------------------

    Running case2
    'ascii' codec can't decode byte 0xda in position 0: ordinal not in range(128)
    --------------------------------------------------------------------------------

    Running case3
    'file' object has no attribute 'buffer'
    --------------------------------------------------------------------------------

अजगर 3.x

Sublime Text 3 3122

    Running case1
    'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
    --------------------------------------------------------------------------------
    Running case2
    b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
    --------------------------------------------------------------------------------
    Running case3
    چرا کار نمیکنی؟--------------------------------------------------------------------------------

ConEmu v151205

    Running case1
    'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
    --------------------------------------------------------------------------------
    Running case2
    b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
    --------------------------------------------------------------------------------
    Running case3
    ┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ--------------------------------------------------------------------------------

विंडोज कमांड प्रॉम्प्ट

    Running case1
    'charmap' codec can't encode characters in position 0-2: character maps to <unde
    fined>
    --------------------------------------------------------------------------------

    Running case2
    b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda
    \xa9\xd9\x86\xdb\x8c\xd8\x9f'
    --------------------------------------------------------------------------------

    Running case3
    ┌åÏ▒Ϻ ┌®ÏºÏ▒ ┘å┘à█î┌®┘å█îσ----------------------------------------------------
    ----------------------------

जैसा कि आप सिर्फ उदात्त text3 टर्मिनल (case3) का उपयोग करके देख सकते हैं ठीक काम किया। अन्य टर्मिनलों ने फारसी का समर्थन नहीं किया। यहां मुख्य बिंदु यह है कि यह निर्भर करता है कि आप किस टर्मिनल और प्लेटफॉर्म का उपयोग कर रहे हैं।

समाधान (ConEmu विशिष्ट)

ConEmu जैसे आधुनिक टर्मिनल आपको UTF8- एन्कोडिंग के साथ काम करने की अनुमति देते हैं जैसा कि यहां बताया गया है , इसलिए, आइए कोशिश करें:

chcp 65001 & cmd

और फिर 2.x और 3.x के खिलाफ स्क्रिप्ट फिर से चल रहा है:

Python2.x

Running case1
��را کار نمیکنی؟[Errno 0] Error
--------------------------------------------------------------------------------
Running case2
'ascii' codec can't decode byte 0xda in position 0: ordinal not in range(128)
--------------------------------------------------------------------------------
Running case3
'file' object has no attribute 'buffer'
--------------------------------------------------------------------------------

Python3.x

Running case1
چرا کار نمیکنی؟
--------------------------------------------------------------------------------
Running case2
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
--------------------------------------------------------------------------------
Running case3
چرا کار نمیکنی؟--------------------------------------------------------------------------------

जैसा कि आप देख सकते हैं, अब आउटपुट python3 case1 (प्रिंट) के साथ succesfull था। तो ... एक कल्पित कहानी का नैतिक ... अपने उपकरणों के बारे में अधिक जानें और अपने उपयोग के मामलों के लिए उन्हें ठीक से कॉन्फ़िगर कैसे करें;;

इस सवाल का पहले से ही यहाँ एक जवाब है:

मैंने बेहतर समझ के लिए अपने कोड को सरल बनाया। यहाँ समस्या है:

मामला एक:

# -*- coding: utf-8 -*-

text = "چرا کار نمیکنی؟" # also using u"...." results the same
print(text)

उत्पादन:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>

मामला 2:

text = "چرا کار نمیکنی؟".encode("utf-8") 
print(text)

कोई आउटपुट नहीं है।

case 3:

import sys

text = "چرا کار نمیکنی؟".encode("utf-8")
sys.stdout.buffer.write(text)

उत्पादन:

چرا کار نمیکنی؟

मुझे पता है कि मामला 3 किसी भी तरह काम करता है, लेकिन मैं अन्य कार्यों जैसे प्रिंट (), राइट (str ()), .... का उपयोग करना चाहता हूं।

मैंने here यूनिकोड के संबंध में अजगर 3 के प्रलेखन को भी पढ़ा।

और stackoverflow में Q & A के दर्जनों भी पढ़ें।

और here एक लंबा लेख है जो समस्या की व्याख्या करता है और अजगर 2.X के लिए उत्तर देता है

सरल सवाल है:

अजगर प्रिंट () फ़ंक्शन का उपयोग करके फ़ारसी या अरबी जैसे गैर-एएससीआईआई पात्रों को कैसे प्रिंट किया जाए?

अद्यतन 1: जैसा कि कई लोगों से यह सुझाव दिया गया है कि समस्या उस टर्मिनल से संबंधित है जिसका मैंने मामला परीक्षण किया है:

मामला 4:

text = "چرا کار نمیکنی؟" .encode("utf-8")# also using u"...." results the same
print(text)

टर्मिनल :

python persian_encoding.py > test.txt

test.txt:

b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'

बहुत महत्वपूर्ण अद्यतन:

इस मुद्दे के साथ खेलने के थोड़ी देर के बाद, आखिरकार मुझे cmd.exe को काम करने के लिए एक और समाधान मिला (बिना कॉनम्यू या जैसे थर्ड पार्टी सॉफ्टवेयर्स की आवश्यकता के):

पहले थोड़ा स्पष्टीकरण:

हमारी मुख्य समस्या पायथन की चिंता नहीं है। यह विंडोज में सेट कमांड प्रॉम्प्ट कैरेक्टर के साथ एक समस्या है (पूर्ण विवरण के लिए अरमान के उत्तर की जांच करें) ... यदि आप डिफ़ॉल्ट एससीआई के बजाय विंडोज कमांड प्रॉम्प्ट के चरित्र सेट को यूटीएफ -8 में बदल देते हैं, तो कमांड प्रॉम्प्ट सक्षम हो जाएगा UTF-8 वर्णों (जैसे फ़ारसी या अरबी) के साथ बातचीत करने के लिए यह समाधान वर्णों के अच्छे प्रतिनिधित्व की गारंटी नहीं देता है (क्योंकि वे छोटे वर्गों की तरह प्रिंट आउट होंगे), लेकिन यदि आप अजगर में I / O फाइल करना चाहते हैं तो यह एक अच्छा समाधान है। UTF-8 वर्णों के साथ।

कदम:

कमांड लाइन से अजगर शुरू करने से पहले, टाइप करें:

chcp 65001

अब हमेशा की तरह अपना पायथन कोड चलाएं।

python testcode.py

मामले में परिणाम 1:

?????? ??? ??????

यह त्रुटियों के बिना चलता है।

स्क्रीनशॉट:

65001 सेट करने के तरीके के बारे में अधिक जानकारी के लिए डिफ़ॉल्ट वर्ण सेट this जाँच this ।


आपका कोड सही है क्योंकि यह पायथन 2 और 3 (मैं OS X पर हूँ) के साथ मेरे कंप्यूटर पर काम करता है:

~$ python -c 'print "تست"'
تست
~$ python3 -c 'print("تست")'
تست

समस्या आपके टर्मिनल के साथ है जो यूनिकोड वर्णों को आउटपुट नहीं कर सकता है। आप अपने आउटपुट को python3 my_file.py > test.txt जैसी फ़ाइल पर पुनर्निर्देशित करके सत्यापित कर सकते हैं और संपादक का उपयोग करके फ़ाइल खोल सकते हैं।

यदि आप विंडोज पर हैं, तो आप Console2 या ConEmu जैसे टर्मिनल का उपयोग कर सकते हैं जो विंडोज प्रॉम्प्ट से बेहतर यूनिकोड प्रदान करता है।

गलत कोड-पृष्ठ / Windows के एन्कोडिंग के कारण आप इन टर्मिनलों के साथ भी त्रुटि का सामना कर सकते हैं। एक छोटा अजगर पैकेज है जो उन्हें ठीक करता है (उन्हें सही ढंग से सेट करता है):

1- this pip install win-unicode-console

2- इसे अपनी अजगर फ़ाइल के शीर्ष पर रखें:

try:
    # Fix UTF8 output issues on Windows console.
    # Does nothing if package is not installed
    from win_unicode_console import enable
    enable()
except ImportError:
    pass

यदि आपको किसी फ़ाइल को रीडायरेक्ट करते समय त्रुटियाँ मिलीं, तो आप इसे सेटिंग्स io एन्कोडिंग द्वारा ठीक कर सकते हैं:

विंडोज कमांड लाइन पर:

SET PYTHONIOENCODING=utf-8

लिनक्स / ओएस एक्स टर्मिनल पर:

export PYTHONIOENCODING=utf-8

कुछ बिंदु

  • अजगर में u"aaa" सिंटैक्स का उपयोग करने की कोई आवश्यकता नहीं है। 3. स्ट्रिंग के शाब्दिक डिफ़ॉल्ट रूप से यूनिकोड हैं।
  • फ़ाइलों की डिफ़ॉल्ट कोडिंग python 3 में UTF8 है इसलिए कोडिंग घोषणा टिप्पणी (जैसे # -*- coding: utf-8 -*- ) की आवश्यकता नहीं है।

मैं समस्या को पुन: पेश नहीं कर सकता। यहाँ मेरी स्क्रिप्ट p.py :

text = "چرا کار نمیکنی؟"
print(text)

और python3 p.py का परिणाम:

چرا کار نمیکنی؟

क्या आप सुनिश्चित हैं कि आप अजगर 3 का उपयोग कर रहे हैं? python2 p.py साथ:

SyntaxError: Non-ASCII character '\xda' in file p.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details




utf-8