كيف يمكنني تحويل تنسيق الملف من Unicode إلى ASCII باستخدام Python؟

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

سؤال

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

ما هي أفضل طريقة لتحويل تنسيق الملف بأكمله باستخدام بايثون؟

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

المحلول

ويمكنك تحويل الملف بسهولة يكفي فقط باستخدام وظيفة unicode، ولكن عليك واجهت مشاكل مع أحرف Unicode دون أي ما يعادل ASCII التوالي.

هذا بلوق توصي حدة unicodedata ، والذي يبدو لرعاية تقريبا تحويل الأحرف دون قيم ASCII المقابلة المباشرة، على سبيل المثال

>>> title = u"Klüft skräms inför på fédéral électoral große"

وعادة ما يتم تحويلها إلى

Klft skrms infr p fdral lectoral groe

والذي هو خطأ كبير. ومع ذلك، باستخدام وحدة unicodedata، يمكن أن تكون النتيجة أقرب إلى النص الأصلي:

>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'

نصائح أخرى

أعتقد أن هذه قضية أعمق مما تدرك.يعد تغيير الملف من Unicode إلى ASCII أمرًا سهلاً، ومع ذلك، فإن الحصول على جميع أحرف Unicode لترجمتها إلى نظيرات ASCII معقولة (العديد من الأحرف غير متوفرة في كلا الترميزين) هو أمر آخر.

قد يمنحك هذا البرنامج التعليمي لـ Python Unicode فكرة أفضل عما يحدث لسلاسل Unicode المترجمة إلى ASCII: http://www.reportlab.com/i18n/python_unicode_tutorial.html

إليك اقتباس مفيد من الموقع:

يحصل Python 1.6 أيضًا على وظيفة مدمجة "Unicode" ، والتي يمكنك تحديد الترميز:

> >>> unicode('hello') u'hello'
> >>> unicode('hello', 'ascii') u'hello'
> >>> unicode('hello', 'iso-8859-1') u'hello'
> >>>

جميع هذه الثلاثة يعيدون نفس الشيء ، لأن الشخصيات في "Hello" شائعة في جميع الترميزات الثلاثة.

الآن دعونا نشفر شيئًا بلكنة أوروبية ، خارج ASCII.ما تراه في وحدة التحكم قد يعتمد على لغة نظام التشغيل الخاصة بك ؛يتيح لي Windows كتابة ISO-Latin-1.

> >>> a = unicode('André','latin-1')
> >>> a u'Andr\202'

إذا لم تتمكن من كتابة حرف حاد E ، فيمكنك إدخال السلسلة "Andr 202" ، وهو أمر لا لبس فيه.

يدعم Unicode جميع العمليات المشتركة مثل التكرار والانقسام.لن نركض فوقهم هنا.

وبالمناسبة، هذه هي iconv القيادة لينكس للقيام بهذا النوع من العمل.

iconv -f utf8 -t ascii <input.txt >output.txt

وهنا بعض بسيطة (وغبي) رمز للقيام الترجمة الترميز. أفترض (ولكن يجب أن لا) أن ملف الإدخال في UTF-16 (يدعو ويندوز هذا ببساطة 'يونيكود).

input_codec = 'UTF-16'
output_codec = 'ASCII'

unicode_file = open('filename')
unicode_data = unicode_file.read().decode(input_codec)
ascii_file = open('new filename', 'w')
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))

لاحظ أن هذا لن تعمل إذا كان هناك أي الأحرف في ملف يونيكود التي ليست كذلك الأحرف ASCII. يمكنك القيام بما يلي لتحويل الأحرف غير المعترف بها في الصورة '؟:

ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace')))

مستندات للحصول على المزيد من الخيارات البسيطة. إذا كنت بحاجة إلى أن تفعل أي شيء أكثر تطورا، قد ترغب في التحقق من المطرقة UNICODE في بيثون كتاب الطبخ.

مثله:

uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')

ومع ذلك، لاحظ أن هذا سوف يفشل مع UnicodeDecodeError استثناء إذا كان هناك أي أحرف لا يمكن تحويلها إلى ASCII.

يحرر:كما أشار بيت كارل للتو، لا يوجد تعيين واحد لواحد من Unicode إلى ASCII.لذلك، لا يمكن تحويل بعض الأحرف ببساطة بطريقة تحافظ على المعلومات.علاوة على ذلك، فإن معيار ASCII هو تقريبًا مجموعة فرعية من UTF-8، لذلك لا تحتاج حقًا إلى القيام بأي فك تشفير.

لمشكلتي حيث أردت فقط لتخطي أحرف غير ASCII وإخراج عادل الانتاج أسكي فقط، عملت الحل أدناه بشكل جيد:

    import unicodedata
    input = open(filename).read().decode('UTF-16')
    output = unicodedata.normalize('NFKD', input).encode('ASCII', 'ignore')

ومن المهم أن نلاحظ أن هناك تنسيق ملف لا "يونيكود". يونيكود يمكن ترميز بايت في عدة طرق مختلفة. الأكثر شيوعا UTF-8 أو UTF-16. سوف تحتاج إلى معرفة أي واحد أداة 3rd الطرف الخاص بك هو إخراج. بمجرد أن تعرف، وتحويل بين ترميزات مختلفة من السهل جدا:

in_file = open("myfile.txt", "rb")
out_file = open("mynewfile.txt", "wb")

in_byte_string = in_file.read()
unicode_string = bytestring.decode('UTF-16')
out_byte_string = unicode_string.encode('ASCII')

out_file.write(out_byte_string)
out_file.close()

وكما لوحظ في ردود أخرى، وربما كنت تريد الذهاب الى توفير معالج الأخطاء إلى أسلوب ترميز. استخدام 'استبدال' كمعالج خطأ بسيط، ولكن فسد النص إذا كان يحتوي على الأحرف التي لا يمكن تمثيلها في ASCII.

كما لاحظت ملصقات أخرى، ASCII هي مجموعة فرعية من Unicode.

ومع ذلك، إذا كنت:

  • لديك تطبيق قديم
  • لا يمكنك التحكم في رمز هذا التطبيق
  • أنت متأكد من أن مدخلاتك تقع ضمن مجموعة ASCII الفرعية

ثم يوضح المثال أدناه كيفية القيام بذلك:

mystring = u'bar'
type(mystring)
    <type 'unicode'>

myasciistring = (mystring.encode('ASCII'))
type(myasciistring)
    <type 'str'>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top