سؤال

لقد تعثرت في هذا المقطع في البرنامج التعليمي جانغو:

نماذج جانغو لها إعدادات افتراضية شارع() الطريقة التي تستدعي يونيكود() ويحول النتيجة إلى سلسلة بايت UTF-8.هذا يعني أن unicode(p) سيُرجع سلسلة Unicode، وstr(p) سيُرجع سلسلة عادية، مع أحرف مشفرة كـ UTF-8.

الآن، أنا في حيرة من أمري لأن afaik Unicode ليس تمثيلًا محددًا، فما هي "سلسلة Unicode" في Python؟هل هذا يعني UCS-2؟ظهرت جوجل هذا "البرنامج التعليمي لبايثون يونيكود" الذي ينص بجرأة

Unicode هو ترميز ثنائي البايت يغطي جميع أنظمة الكتابة الشائعة في العالم.

وهو خطأ واضح، أم أنه؟لقد كنت في حيرة من أمري عدة مرات بسبب مشكلات مجموعة الأحرف والتشفير، ولكن هنا أنا متأكد تمامًا من أن الوثائق التي أقرأها مشوشة.هل يعرف أحد ما الذي يحدث في بايثون عندما يعطيني "سلسلة Unicode"؟

هل كانت مفيدة؟

المحلول

ما هي "سلسلة Unicode" في بايثون؟هل هذا يعني UCS-2؟

يتم تخزين سلاسل Unicode في Python داخليًا إما كـ UCS-2 (تمثيل 16 بت بطول ثابت، تقريبًا نفس UTF-16) أو UCS-4/UTF-32 (تمثيل 32 بت بطول ثابت).إنه خيار وقت الترجمة؛على نظام التشغيل Windows، يكون دائمًا UTF-16 بينما تقوم العديد من توزيعات Linux بتعيين UTF-32 ("الوضع الواسع") لإصداراتها من Python.

ليس من المفترض عمومًا أن تهتم بما يلي:سترى نقاط ترميز Unicode كعناصر فردية في سلاسلك ولن تعرف ما إذا كانت مخزنة على شكل بايتين أو أربعة بايت.إذا كنت في إصدار UTF-16 وتحتاج إلى التعامل مع أحرف خارج المستوى الأساسي متعدد اللغات، فسوف تفعل ذلك بشكل خاطئ، لكن هذا لا يزال نادرًا جدًا، ويجب على المستخدمين الذين يحتاجون حقًا إلى أحرف إضافية تجميع بنيات واسعة.

خطأ واضح، أم هو؟

نعم، هذا خطأ تماما.لكي نكون منصفين، أعتقد أن هذا البرنامج التعليمي قديم نوعًا ما؛من المحتمل أنه يسبق تاريخ سلاسل Unicode الواسعة، إن لم يكن Unicode 3.1 (الإصدار الذي قدم أحرفًا خارج المستوى الأساسي متعدد اللغات).

هناك مصدر إضافي للارتباك ينبع من عادة Windows في استخدام المصطلح "Unicode" ليعني، على وجه التحديد، ترميز UTF-16LE الذي يستخدمه NT داخليًا.غالبًا ما يقوم الأشخاص من Microsoftland بتقليد هذه العادة المضللة إلى حد ما.

نصائح أخرى

وفي الوقت نفسه، قمت بإجراء بحث دقيق للتحقق من ماهية التمثيل الداخلي في بايثون، وكذلك ما هي حدوده."الحقيقة حول Unicode في بايثون"مقال جيد جدًا يستشهد به مباشرة من مطوري Python.من الواضح أن التمثيل الداخلي هو إما UCS-2 أو UCS-4 اعتمادًا على مفتاح وقت الترجمة.حسنًا يا جون، إنه ليس UTF-16، لكن إجابتك وضعتني على المسار الصحيح على أي حال، شكرًا.

تقوم بايثون بتخزين Unicode كـ UTF-16.ستُرجع الدالة str()‎ تمثيل UTF-8 لسلسلة UTF-16.

من ويكيبيديا على UTF-8:

UTF-8 (تنسيق تحويل UCS/Unicode 8 بت) هو أ ترميز أحرف متغير الطول لـ Unicode.إنه قادر على تمثيل أي حرف في معيار Unicode, ومع ذلك، فإن التشفير الأولي لرموز البايت وتعيينات الأحرف لـ UTF-8 متوافق مع ASCII.لهذه الأسباب، أصبح هذا التشفير هو الترميز المفضل للبريد الإلكتروني وصفحات الويب [1] والأماكن الأخرى التي يتم فيها تخزين الأحرف أو بثها.

لذا، فهو يتراوح بين بايت واحد وأربعة بايت اعتمادًا على الحرف الذي ترغب في تمثيله داخل عالم Unicode.

من ويكيبيديا على يونيكود:

في مجال الحوسبة، يعد Unicode معيارًا صناعيًا يسمح لأجهزة الكمبيوتر بتمثيل ومعالجة النص المعبر عنه بشكل متسق معظم أنظمة الكتابة في العالم.

لذا فهو قادر على تمثيل معظم (ولكن ليس كل) أنظمة الكتابة في العالم.

آمل أن يساعد هذا :)

إذن ما هي "سلسلة يونيكود" في بيثون؟

بايثون "تعرف" أن السلسلة الخاصة بك هي Unicode.ومن ثم، إذا قمت بإجراء regex عليه، فسوف يعرف ما هي الشخصية وما هو ليس كذلك، وهو أمر مفيد حقًا.إذا قمت بعمل سترلين فسوف يعطي النتيجة الصحيحة أيضًا.على سبيل المثال، إذا قمت بعدد السلاسل على Hello، فستحصل على 5 (حتى لو كان Unicode).ولكن إذا قمت بإحصاء سلسلة لكلمة أجنبية ولم تكن تلك السلسلة عبارة عن سلسلة Unicode فستحصل على نتيجة أكبر بكثير.تستخدم Pythong المعلومات من قاعدة بيانات أحرف Unicode لتحديد كل حرف في سلسلة Unicode.امل ان يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top