سؤال

لديّ سلسلة في Unicode وأحتاج إلى إعادة الأحرف الأولى. أفعل هذا:

result = unistring[:5]

ولكن بالطبع طول سلاسل Unicode! = طول الأحرف. أيه أفكار؟ الحل الوحيد هو استخدام إعادة؟

تحرير: مزيد من المعلومات

unistring = "Μεταλλικα" #Metallica written in Greek letters
result = unistring[:1]

العودة->؟

أعتقد أن سلاسل Unicode هي بايتان (char) ، ولهذا السبب يحدث هذا الشيء. إذا فعلت:

result = unistring[:2]

انا حصلت

M

ما هو الصحيح ، لذلك ، هل يجب أن أقوم دائمًا بقطع*2 أو هل يجب أن أتحول إلى شيء ما؟

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

المحلول

لسوء الحظ لأسباب تاريخية قبل Python 3.0 ، هناك نوعان من السلسلة. سلاسل البايت (str) وسلاسل يونيكود (unicode).

قبل التوحيد في Python 3.0 ، هناك طريقتان لإعلان سلسلة حرفية: unistring = "Μεταλλικα" وهي سلسلة بايت و unistring = u"Μεταλλικα" وهي سلسلة يونيكود.

سبب رؤيتك ? عندما تفعل result = unistring[:1] هو لأن بعض الأحرف في نص Unicode الخاص بك لا يمكن تمثيلها بشكل صحيح في السلسلة غير unicode. من المحتمل أن تكون قد شاهدت هذا النوع من المشكلات إذا كنت قد استخدمت عميل بريد إلكتروني قديم حقًا وتلقيت رسائل بريد إلكتروني من الأصدقاء في بلدان مثل اليونان على سبيل المثال.

لذلك في Python 2.x إذا كنت بحاجة إلى التعامل مع Unicode ، فعليك القيام بذلك بشكل صريح. ألق نظرة على هذه المقدمة للتعامل مع Unicode في Python: يونيكود Howto

نصائح أخرى

عندما تقول:

unistring = "Μεταλλικα" #Metallica written in Greek letters

أنت لا أملك سلسلة يونيكود. لديك بايت في (من المفترض) UTF-8. ليس ذلك بالشيئ نفسه. سلسلة Unicode هي نوع بيانات منفصل في Python. يمكنك الحصول على Unicode عن طريق فك التشفير باستخدام الترميز الأيمن:

unistring = "Μεταλλικα".decode('utf-8')

أو باستخدام Unicode الحرفي في ملف مصدر مع إعلان الترميز الأيمن

# coding: UTF-8
unistring = u"Μεταλλικα"

ستفعل سلسلة Unicode ما تريد عندما تفعل unistring[:5].

لا يوجد نهج صحيح مباشرة مع أي نوع من "سلسلة Unicode".

حتى سلسلة Python "Unicode" UTF-16 لها أحرف طول متغيرة ، لا يمكنك فقط قطعها باستخدام USTRING [: 5]. نظرًا لأن بعض نقاط رمز Unicode قد تستخدم أكثر من "حرف" واحد ، أي أزواج بديلة.

لذلك إذا كنت تريد قطع 5 نقاط الرمز (لاحظ أن هذه ليست كذلك الشخصيات) لذلك يمكنك تحليل النص ، انظر http://en.wikipedia.org/wiki/Utf-8 و http://en.wikipedia.org/wiki/UTF-16 تعريفات. لذلك تحتاج إلى استخدام بعض أقنعة بت لمعرفة الحدود.

كما أنك لا تزال لا تحصل على شخصيات. لأنه على سبيل المثال. Word "שָלוֹם" -- peace in Hebrew "Shalom" consists of 4 characters and 6 code points letter "shin", vowel "a" letter "lamed", letter "vav" and vowel "o" and final letter "mem".

لذا حرف ليس نقطة الرمز.

نفس الشيء بالنسبة لمعظم اللغات الغربية حيث يمكن تمثيل خطاب مع قيود النقطتين. ابحث على سبيل المثال عن "تطبيع يونيكود".

لذلك ... إذا كنت بحاجة حقًا إلى 5 أحرف أولى ، فعليك استخدام أدوات مثل مكتبة وحدة العناية المركزة. على سبيل المثال ، هناك مكتبة وحدة العناية المركزة لـ Python التي توفر أحرف الحدود.

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