سؤال

في ملف نصي هناك سلسلة "أنا لا أحب هذا".

ومع ذلك ، عندما قرأت في سلسلة ، يصبح "لا\xe2\x80\x98t مثل هذا".أنا أفهم أن \u2018 هو unicode تمثيل "'".يمكنني استخدام

f1 = open (file1, "r")
text = f1.read()

أمر لفعل القراءة.

الآن, هل من الممكن أن قراءة السلسلة في مثل هذه الطريقة التي عندما يتم قراءة في السلسلة هو "أنا لا أحب هذا" بدلا من "لا\xe2\x80\x98t مثل هذا مثل هذا" ؟

تحرير الثاني:لقد رأيت بعض الناس استخدام الخرائط لحل هذه المشكلة, ولكن في الحقيقة, لا يوجد المدمج في تحويل هذا هل هذا النوع من ANSI إلى unicode ( والعكس بالعكس) التحويل ؟

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

المحلول

Ref: http://docs.python.org/howto/unicode

القراءة Unicode من ملف ولذلك بسيطة:

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
    print repr(line)

ومن الممكن أيضا فتح الملفات في وضع تحديث السماح لكل من القراءة والكتابة:

f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()

تحرير:أنا على افتراض أن المقصود الهدف هو فقط أن تكون قادرا على قراءة الملف بشكل صحيح إلى سلسلة في بيثون.إذا كنت تحاول تحويل سلسلة ASCII من يونيكود ، ومن ثم ليس هناك طريقة مباشرة لفعل ذلك لأن أحرف Unicode لا توجد بالضرورة في ASCII.

إذا كنت تحاول تحويل سلسلة ASCII, حاول تنفيذ أحد الإجراءات التالية:

  1. محل محددة unicode حرف مع ASCII حكمه إذا كنت تبحث فقط إلى التعامل مع بعض الحالات الخاصة مثل هذا المثال

  2. استخدام unicodedata الوحدة النمطية normalize() و string.encode() طريقة لتحويل أفضل ما يمكنك الأقرب القادم ASCII ما يعادل (المرجع https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'
    

نصائح أخرى

هناك عدد قليل من النقاط في الاعتبار.

أ \u2018 شخصية قد تظهر فقط جزء من تمثيل سلسلة unicode في بيثون ، على سبيل المثالإذا كنت أكتب:

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

الآن إذا كنت ببساطة ترغب في طباعة سلسلة unicode نحو جميل, مجرد استخدام يونيكود هو encode الطريقة:

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this

للتأكد من أن كل خط من أي ملف يكون نصها كما unicode كنت أفضل استخدام codecs.open بدلا من مجرد وظيفة open, الذي يسمح لك بتحديد ملف الترميز:

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this

ولكن هو حقا "لا\u2018t مثل هذا" وليس "أنا لا أحب هذا".حرف u'\u2018' هو شخصية مختلفة تماما عن "'" (،بصريا ، يجب أن تتوافق مع المزيد "').

إذا كنت تحاول تحويل ترميز يونيكود في ASCII عادي, ربما كنت يمكن أن تبقي على خرائط unicode علامات الترقيم التي ترغب في ترجمتها إلى ASCII.

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

هناك الكثير من علامات الترقيم أحرف unicode, ومع ذلك, ولكن أنا افترض أنك يمكن الاعتماد على عدد قليل منهم في الواقع يجري استخدامها من قبل أيا كان التطبيق هو خلق وثائق كنت تقرأ.

وإذا نحينا جانبا حقيقة أن النص الخاص بك ملف مكسورة (U+2018 هو ترك علامة الاقتباس ليس بعلامة اقتباس أحادية):iconv يمكن استخدامها transliterate أحرف unicode إلى ascii.

عليك أن جوجل عن "iconvcodec" ، لأن الوحدة لا يبدو أن تكون معتمدة بعد الآن وأنا لا يمكن أن تجد الكنسي الصفحة الرئيسية لذلك.

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

بدلا من ذلك يمكنك استخدام iconv أداة سطر الأوامر لتنظيف الملف الخاص بك:

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.

هناك احتمال أن بطريقة ما لديك unicode سلسلة مع unicode أحرف الهروب ، على سبيل المثال:

>>> print repr(text)
'I don\\u2018t like this'

هذا فعلا حدث لي مرة واحدة من قبل.يمكنك استخدام unicode_escape الترميز لفك السلسلة إلى unicode ثم ترميز إلى أي صيغة تريد:

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this

هذا هو الثعابين الطريقة لا تظهر لك ترميز unicode السلاسل.ولكن أعتقد أن عليك أن تكون قادرا على طباعة السلسلة على الشاشة أو الكتابة إلى ملف جديد بدون أي مشاكل.

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this

في الواقع, U+2018 Unicode تمثيل طابع خاص ' .إذا كنت تريد, يمكنك تحويل الحالات من هذا حرف U+0027 مع هذا الرمز:

text = text.replace (u"\u2018", "'")

وبالإضافة إلى ذلك ما تستخدمه لكتابة الملف ؟ f1.read() يجب إرجاع السلسلة التي تبدو مثل هذا:

'I don\xe2\x80\x98t like this'

إذا كانت عودته هذا سلسلة ملف مكتوب بشكل غير صحيح:

'I don\u2018t like this'

ومن الممكن أيضا قراءة مشفر ملف نصي باستخدام بيثون 3 قراءة الطريقة:

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

مع هذا الاختلاف ، هناك حاجة إلى استيراد أي مكتبات إضافية

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