تحويل سلسلة Unicode إلى سلسلة في بيثون (التي تحتوي على حرف إضافية)

StackOverflow https://stackoverflow.com/questions/1207457

سؤال

وكيف قمت بتحويل سلسلة Unicode (التي تحتوي على الأحرف الزائدة مثل $ £، الخ) إلى سلسلة بيثون؟

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

المحلول

title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'

نصائح أخرى

ويمكنك استخدام ترميز إلى ASCII إذا كنت لا تحتاج إلى ترجمة الأحرف غير ASCII:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
>>> text=u'abcd'
>>> str(text)
'abcd'

إذا السلسلة يحتوي فقط على أحرف ASCII.

إذا كان لديك سلسلة Unicode، وكنت أريد أن أكتب هذا لملف، أو شكل تسلسل آخر، يجب عليك أولا <م> ترميز قبل أن تتحول إلى التمثيل بشكل خاص التي يمكن تخزينها. هناك العديد من ترميزات يونيكود المشتركة، مثل UTF-16 (يستخدم اثنين بايت بالنسبة لمعظم أحرف Unicode) أو UTF-8 (1-4 بايت / التمثيل البرمجي اعتمادا على شخصية)، وما إلى ذلك لتحويل هذه السلسلة إلى ترميز معين، كنت يمكن استخدام:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

وهذه السلسلة الخام بايت يمكن كتابة إلى ملف. ومع ذلك، لاحظ أنه عندما القراءة مرة أخرى، يجب أن تعرف ما هو الترميز في وترجم ذلك باستخدام نفس الترميز.

عند الكتابة إلى الملفات، يمكنك التخلص من هذه العملية ترميز / فك اليدوية باستخدام الترميز rel="noreferrer"> . لذلك، لفتح الملف الذي يشفر كافة السلاسل Unicode إلى UTF-8 أو:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

هل لاحظ أن أي شيء آخر هو أن استخدام هذه الملفات يجب أن نفهم ما ترميز الملف في اذا كانوا يريدون قراءتها. إذا كنت الوحيد الذي يفعل القراءة / الكتابة هذه ليست مشكلة، وجعل ذلك من أن تكتب في شكل مفهومة من قبل أي شيء آخر يستخدم الملفات.

في بيثون 3، وهذا شكل من الوصول إلى الملفات هو الافتراضي، والمدمج في وظيفة open سوف تأخذ المعلمة ترميز ودائما تترجم إلى / من Unicode السلاسل (الكائن السلسلة الافتراضية في بيثون 3) عن الملفات التي تم فتحها في النص واسطة.

وهنا مثال:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

حسنا، إذا كنت على استعداد / على استعداد للانتقال إلى بيثون 3 (الذي قد لا يكون راجعا إلى عدم التوافق الوراء مع بعض بايثون 2 كود)، لم يكن لديك للقيام بأي تحويل؛ ويمثل كل النص في بيثون 3 مع سلاسل Unicode، وهو ما يعني أيضا أنه لا يوجد المزيد من استخدام بناء الجملة u'<text>'. لديك أيضا ما هي، في الواقع، سلاسل من وحدات البايت، والتي تستخدم لتمثيل البيانات (والذي قد يكون عبارة عن سلسلة المشفرة).

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(وبطبيعة الحال، إذا كنت تستخدم حاليا بيثون 3، ثم المشكلة المحتمل أن تفعل شيئا مع كيف كنت تحاول حفظ النص إلى ملف.)

وهنا هو رمز المثال

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top