คำนำ: ผู้ชมของคุณจะทำงานหรือไม่
ตรวจสอบให้แน่ใจว่าวิวเวอร์ / บรรณาธิการ / เทอร์มินัลของคุณ (อย่างไรก็ตามคุณกำลังโต้ตอบกับไฟล์ที่เข้ารหัส utf-8 ของคุณ) สามารถอ่านไฟล์ได้ นี่เป็นปัญหาที่พบบ่อยในWindowsเช่น Notepad
กำลังเขียนข้อความ Unicode ไปยังไฟล์ข้อความ?
ใน Python 2 ให้ใช้open
จากio
โมดูล (ซึ่งเหมือนกับใน builtin open
ใน Python 3):
import io
วิธีปฏิบัติที่ดีที่สุดโดยทั่วไปใช้UTF-8
สำหรับเขียนไฟล์ (เราไม่ต้องกังวลกับการสั่งไบต์ด้วย utf-8)
encoding = 'utf-8'
utf-8 เป็นการเข้ารหัสที่ทันสมัยที่สุดและใช้งานได้ในระดับสากลใช้ได้กับทุกเว็บเบราว์เซอร์ตัวแก้ไขข้อความส่วนใหญ่ (ดูการตั้งค่าของคุณหากคุณมีปัญหา) และเทอร์มินัล / เชลล์ส่วนใหญ่
บน Windows คุณอาจลองใช้utf-16le
หากคุณ จำกัด การรับชมใน Notepad (หรือตัวแสดงที่ จำกัด อื่น)
encoding = 'utf-16le' # sorry, Windows users... :(
และเพียงแค่เปิดมันด้วยตัวจัดการบริบทและเขียนตัวอักษรยูนิโค้ดของคุณออกมา:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
ตัวอย่างการใช้อักขระ Unicode จำนวนมาก
นี่คือตัวอย่างที่พยายามแมปอักขระที่เป็นไปได้ทุกตัวที่มีความกว้างสูงสุดสามบิต (4 คือสูงสุด แต่นั่นอาจจะไกลไปหน่อย) จากการแสดงแบบดิจิทัล (เป็นจำนวนเต็ม) ไปยังเอาต์พุตที่เข้ารหัสได้พร้อมชื่อ เป็นไปได้ (ใส่ลงในไฟล์ที่เรียกว่าuni.py
):
from __future__ import print_function
import io
from unicodedata import name, category
from curses.ascii import controlnames
from collections import Counter
try: # use these if Python 2
unicode_chr, range = unichr, xrange
except NameError: # Python 3
unicode_chr = chr
exclude_categories = set(('Co', 'Cn'))
counts = Counter()
control_names = dict(enumerate(controlnames))
with io.open('unidata', 'w', encoding='utf-8') as f:
for x in range((2**8)**3):
try:
char = unicode_chr(x)
except ValueError:
continue # can't map to unicode, try next x
cat = category(char)
counts.update((cat,))
if cat in exclude_categories:
continue # get rid of noise & greatly shorten result file
try:
uname = name(char)
except ValueError: # probably control character, don't use actual
uname = control_names.get(x, '')
f.write(u'{0:>6x} {1} {2}\n'.format(x, cat, uname))
else:
f.write(u'{0:>6x} {1} {2} {3}\n'.format(x, cat, char, uname))
# may as well describe the types we logged.
for cat, count in counts.items():
print('{0} chars of category, {1}'.format(count, cat))
สิ่งนี้จะทำงานในเวลาประมาณหนึ่งนาทีและคุณสามารถดูไฟล์ข้อมูลและหากโปรแกรมดูไฟล์ของคุณสามารถแสดงยูนิโค้ดคุณจะเห็นมัน ข้อมูลเกี่ยวกับประเภทที่สามารถพบได้ที่นี่ จากการนับเราอาจปรับปรุงผลลัพธ์ของเราได้โดยไม่รวมหมวดหมู่ Cn และ Co ซึ่งไม่มีสัญลักษณ์ที่เกี่ยวข้อง
$ python uni.py
มันจะแสดงการทำแผนที่เลขฐานสิบหก, หมวดหมู่ , สัญลักษณ์ (เว้นแต่จะไม่สามารถรับชื่อ, ดังนั้นอาจเป็นตัวควบคุม) และชื่อของสัญลักษณ์ เช่น
ฉันแนะนำless
บน Unix หรือ Cygwin (อย่าพิมพ์ / cat ไฟล์ทั้งหมดไปยังผลลัพธ์ของคุณ):
$ less unidata
เช่นจะแสดงคล้ายกับบรรทัดต่อไปนี้ซึ่งฉันสุ่มตัวอย่างจากมันโดยใช้ Python 2 (unicode 5.2):
0 Cc NUL
20 Zs SPACE
21 Po ! EXCLAMATION MARK
b6 So ¶ PILCROW SIGN
d0 Lu Ð LATIN CAPITAL LETTER ETH
e59 Nd ๙ THAI DIGIT NINE
2887 So ⢇ BRAILLE PATTERN DOTS-1238
bc13 Lo 밓 HANGUL SYLLABLE MIH
ffeb Sm → HALFWIDTH RIGHTWARDS ARROW
Python 3.5 ของฉันจาก Anaconda มียูนิโค้ด 8.0 ฉันจะทึกทักถึง 3 อย่างที่สุด