অজগরকে স্ট্রিং দিয়ে ইউনিকোড ঘোষণা করবেন কেন?


122

আমি এখনও অজগর শিখছি এবং আমার সন্দেহ আছে:

পাইথন ২.6.x এ আমি সাধারণত ফাইল শিরোনামে এ জাতীয় এনকোডিং ঘোষণা করি ( পিইপি 0263 এর মতো )

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

এর পরে, আমার স্ট্রিংগুলি যথারীতি লিখিত:

a = "A normal string without declared Unicode"

তবে যতবারই আমি একটি অজগর প্রকল্প কোড দেখি, শিরোনামে এনকোডিং ঘোষিত হয় না। পরিবর্তে, এটি প্রতিটি স্ট্রিংয়ে এভাবে ঘোষিত হয়:

a = u"A string with declared Unicode"

পার্থক্য কি? এর উদ্দেশ্য কী? আমি জানি পাইথন ২.6.x পূর্বনির্ধারিতভাবে এএসসিআইআই এনকোডিং সেট করে, তবে এটি শিরোনামের ঘোষণার দ্বারা ওভাররেড করা যায়, সুতরাং প্রতি স্ট্রিং ডিক্লেয়ারেশনের বিন্দুটি কী?

সংযোজন: মনে হচ্ছে আমি স্ট্রিং এনকোডিংয়ের সাথে ফাইল এনকোডিং মিশ্রিত করেছি। এটি ব্যাখ্যা করার জন্য ধন্যবাদ :)


6
# coding: utf8যথেষ্ট ভাল, কোনও প্রয়োজন নেই-*-
জেলিফিশ

1
@ জেলিফিশ আমি আপনাকে টাইপ করতে চেয়েছিলাম বলে ধরে নিই # coding: utf-8
স্যামুয়েল হারমার

হওয়া উচিত #coding=utf-8পাইথন.আর.দেব
শেন

উত্তর:


167

এগুলি দুটি ভিন্ন জিনিস, যেমন অন্যরা উল্লেখ করেছেন।

আপনি নির্দিষ্ট করার সময়# -*- coding: utf-8 -*- , আপনি পাইথনকে বলছেন যে উত্স ফাইলটি আপনি সংরক্ষণ করেছেন তা utf-8। পাইথন 2 এর ডিফল্ট হ'ল ASCII (পাইথন 3 এর জন্য utf-8)। এটি কেবল প্রভাবিত করে যে দোভাষী কীভাবে ফাইলের অক্ষরগুলি পড়েন।

সাধারণভাবে, এনকোডিংটি যাই হোক না কেন আপনার ফাইলে উচ্চ ইউনিকোড অক্ষর এম্বেড করা সম্ভবত সেরা ধারণা নয়; আপনি স্ট্রিং ইউনিকোড পলায়ন ব্যবহার করতে পারেন, যা উভয়ই এনকোডিংয়ে কাজ করে।


আপনি যখন uসামনে একটি স্ট্রিং ঘোষণা করেন , যেমন u'This is a string', এটি পাইথন সংকলককে বলে যে স্ট্রিংটি ইউনিকোড, বাইট নয়। এটি দোভাষী দ্বারা বেশিরভাগ স্বচ্ছভাবে পরিচালনা করা হয়; সর্বাধিক সুস্পষ্ট পার্থক্য হ'ল আপনি এখন স্ট্রিংটিতে ইউনিকোড অক্ষর এম্বেড করতে পারবেন (এটি u'\u2665'এখন আইনী)। আপনি from __future__ import unicode_literalsএটি ডিফল্ট করতে ব্যবহার করতে পারেন ।

এটি কেবল পাইথন 2 এ প্রযোজ্য; পাইথন 3-এ ডিফল্টটি ইউনিকোড হয় এবং আপনাকে bসামনে একটি নির্দিষ্ট করতে হবে (যেমন b'These are bytes', বাইটের ক্রম ঘোষণা করতে)।


ব্যাখ্যার জন্য ধন্যবাদ! আমি এটিকে গ্রহণযোগ্য হিসাবে সেট করব যেহেতু সবচেয়ে সম্পূর্ণ এক :)
অস্কার কার্বলাল

2
পাইথন 2 এর জন্য ডিফল্ট উত্স এনকোডিং হ'ল আসকি
মার্ক টোলোনেন

27
এটি আপনার ফাইলে উচ্চ ইউনিকোড অক্ষর এম্বেড করা আসলে একটি দুর্দান্ত ধারণা। আমি সন্দেহ করি যে অ-ইংরাজী স্পিকার তাদের স্ট্রিংগুলিতে ইউনিকোড পলায়ন পড়তে চায়।
মার্ক টোলোনেন

@ মার্ক: এএসসিআইআই সংশোধনের জন্য ধন্যবাদ; আমি দ্রুত পিইপি স্ক্রিম করেছিলাম ( পাইথন.আর / দেবদেবী / পেপস / পেপ ০২6363 ) এবং এটি উপস্থাপনে লাতিন -১ সম্পর্কে আলোচনা করে। আপনার ফাইলটিতে বেশিরভাগ ক্ষেত্রে উচ্চ ইউনিকোড অক্ষর এম্বেড করা আমার পক্ষে দুর্দান্ত ধারণা নয়। অবশ্যই, আপনি যদি আপনার সোর্স ফাইলে প্রচুর অ-ইংরাজী স্ট্রিং কোডিং করে থাকেন তবে এটি সহজ করে তুলতে পারে, তবে আপনি সাধারণত এটি ব্যবহারকারীর কাছে প্রদর্শন করার জন্য করেন এবং আপনার সম্ভবত পৃথক স্থানে সেগুলি সংজ্ঞায়িত করা উচিত। এবং একটি একক ভুল কনফিগার্ড টেক্সট সম্পাদক এই সমস্ত অক্ষরকে দূষিত করতে পারে।
ক্রিস বি

4
আপনি যদি i18nalized অ্যাপ্লিকেশন প্রোগ্রাম করে থাকেন তবে সম্মত হন, তবে আপনি চীনা বা ফরাসি প্রোগ্রামার কিনা তা বিবেচনা করুন। এটি কেবল স্ট্রিংই নয়, পাশাপাশি মন্তব্যগুলিও। পাইথনটি উত্স এনকোডিংগুলির সাথে নমনীয় great পাইথন 3 এর এমনকি চলক নামগুলিতে অ-ASCII অক্ষর থাকতে পারে।
মার্ক টোলোনেন

23

অন্যরা যেমন বলেছে, # coding:উত্স ফাইলটি এনকোডিংটি সংরক্ষিত হয়েছে তা নির্দিষ্ট করে। এখানে এটি উদাহরণস্বরূপ কয়েকটি উদাহরণ দেওয়া হল:

একটি ফাইল সিপি 437 (আমার কনসোল এনকোডিং) হিসাবে ডিস্কে সংরক্ষণ করা হয়েছে, তবে কোনও এনকোডিং ঘোষিত হয়নি

b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)

আউটপুট:

  File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details

# coding: cp437যুক্ত ফাইলের আউটপুট :

über '\x81ber'
über u'\xfcber'

প্রথমে পাইথন এনকোডিংটি জানত না এবং এএসসিআইআই-র চরিত্র সম্পর্কে অভিযোগ করেছিল। একবার এটি এনকোডিংটি জানার পরে, বাইট স্ট্রিংটি বাইটগুলি পেয়েছিল যা আসলে ডিস্কে ছিল। ইউনিকোড STRING এর জন্য, পাইথন, \ x81 পড়া জানতেন যে cp437 যে একটি ছিল ü , এবং ইউনিকোড কোডপয়েন্ট সেটিকে সঙ্কেতমুক্ত ü যা U + এ 00FC হয়। বাইট স্ট্রিংটি মুদ্রিত হলে পাইথন হেক্স মানটি 81সরাসরি কনসোলে প্রেরণ করে । যখন ইউনিকোড স্ট্রিং ছাপা হত, পাইথন সঠিকভাবে cp437 হিসাবে আমার এনকোডিং কনসোল শনাক্ত ইউনিকোড অনূদিত ü জন্য cp437 মান ü

ইউটিএফ -8 এ একটি ফাইল ঘোষিত ও সংরক্ষণের সাথে কী ঘটে তা এখানে:

├╝ber '\xc3\xbcber'
über u'\xfcber'

ইউটিএফ -8 এ, ü হেক্স বাইট হিসাবে এনকোড করা হয়েছে C3 BC, সুতরাং বাইট স্ট্রিংটিতে সেই বাইট রয়েছে তবে ইউনিকোড স্ট্রিংটি প্রথম উদাহরণের মতো। পাইথন দুটি বাইট পড়ে সেটিকে সঠিকভাবে ডিকোড করে। পাইথন বাইট স্ট্রিংটি ভুলভাবে মুদ্রণ করেছিল, কারণ এটি দুটি ইউটিএফ -8 বাইট প্রেরণ করে ü সরাসরি আমার সিপি 437 কনসোলে।

এখানে ফাইলটি সিপি 437 হিসাবে ঘোষিত হয়েছে, তবে ইউটিএফ -8 এ সংরক্ষিত হয়েছে:

├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'

বাইট স্ট্রিংটি তখনও ডিস্কে বাইটস (ইউটিএফ -8 হেক্স বাইটস C3 BC) পেয়েছে , তবে তাদের একক ইউটিএফ -8-এনকোডেড অক্ষরের পরিবর্তে দুটি সিপি 437 অক্ষর হিসাবে ব্যাখ্যা করেছে। এই দুটি অক্ষর যেখানে ইউনিকোড কোড পয়েন্টগুলিতে অনুবাদ হয়েছে এবং সমস্ত কিছু ভুলভাবে মুদ্রণ করে।


10

এটি স্ট্রিংয়ের ফর্ম্যাট সেট করে না; এটি ফাইলের ফর্ম্যাট সেট করে। এমনকি সেই শিরোলেখ সহ, "hello"একটি বাইট স্ট্রিং, কোনও ইউনিকোড স্ট্রিং নয়। এটি ইউনিকোড তৈরি করতে, আপনাকে u"hello"সর্বত্র ব্যবহার করতে হবে । .pyফাইলটি পড়ার সময় কোন ফর্ম্যাটটি ব্যবহার করা উচিত তা শিরোনামের শিরোনাম ।


আমার তখন ভুল হয়েছিল, আমি ভেবেছিলাম তারা একই ছিল। তাহলে ইউনিকোড স্ট্রিংয়ের ব্যবহার i18n?
অস্কার কার্বলাল

@ অস্কার: হ্যাঁ, বেশিরভাগ অংশের জন্য। আপনি যদি জ্যাঙ্গো বা অন্য কোনও কিছু নিয়ে কোনও ওয়েবসাইট তৈরি করছিলেন এবং এটিতে ASCII বিহীন অক্ষরযুক্ত লোকদের পরিচালনা করতে হয়েছিল, তবে এটি অন্য সম্ভাব্য ব্যবহার।
ইক্টোফায়

7

শিরোনাম সংজ্ঞাটি কোডের নিজেই এনকোডিং সংজ্ঞায়িত করা হয়, রানটাইম সময়ে ফলাফলগুলি না করে।

পাইথন স্ক্রিপ্টে utf-8 শিরোনামের সংজ্ঞা ছাড়াই অ-এসকিআই চরিত্রটি স্থাপন করা একটি সতর্কতা ছুঁড়ে দেবে

ত্রুটি


-1

আমি ভেরিয়েবলগুলিতে রূপান্তর করতে সক্ষম হতে ইউনিকোডার নামে নিম্নলিখিত মডিউলটি তৈরি করেছি:

import sys
import os

def ustr(string):

    string = 'u"%s"'%string

    with open('_unicoder.py', 'w') as script:

        script.write('# -*- coding: utf-8 -*-\n')
        script.write('_ustr = %s'%string)

    import _unicoder
    value = _unicoder._ustr

    del _unicoder
    del sys.modules['_unicoder']

    os.system('del _unicoder.py')
    os.system('del _unicoder.pyc')

    return value

তারপরে আপনার প্রোগ্রামে আপনি নিম্নলিখিতগুলি করতে পারেন:

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

from unicoder import ustr

txt = 'Hello, Unicode World'
txt = ustr(txt)

print type(txt) # <type 'unicode'>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.