UnicodeDecodeError เมื่อเปลี่ยนเส้นทางไปยังไฟล์


100

ฉันเรียกใช้ข้อมูลโค้ดนี้สองครั้งในเทอร์มินัล Ubuntu (ตั้งค่าการเข้ารหัสเป็น utf-8) หนึ่งครั้ง./test.pyด้วย./test.py >out.txt:

uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni

หากไม่มีการเปลี่ยนเส้นทางจะพิมพ์ขยะ ด้วยการเปลี่ยนเส้นทางฉันจะได้รับ UnicodeDecodeError ใครช่วยอธิบายได้ไหมว่าทำไมฉันถึงได้รับข้อผิดพลาดในกรณีที่สองหรือให้คำอธิบายโดยละเอียดว่าเกิดอะไรขึ้นหลังม่านในทั้งสองกรณี


คำตอบนี้อาจช่วยได้เช่นกัน
tzot

เมื่อฉันพยายามจำลองการค้นหาของคุณฉันได้รับ UnicodeEncodeError ไม่ใช่ UnicodeDecodeError gist.github.com/jaraco/12abfc05872c65a4f3f6cd58b6f9be4d
Jason

คำตอบ:


252

กุญแจสำคัญทั้งหมดของปัญหาการเข้ารหัสดังกล่าวคือการเข้าใจว่าโดยหลักการแล้วมีแนวคิดที่แตกต่างกันสองประการของ "สตริง" : (1) สตริงของอักขระและ (2) สตริง / อาร์เรย์ของไบต์. ความแตกต่างนี้ส่วนใหญ่ถูกละเลยมาเป็นเวลานานเนื่องจากความแพร่หลายในอดีตของการเข้ารหัสที่มีอักขระไม่เกิน 256 ตัว (ASCII, Latin-1, Windows-1252, Mac OS Roman, ... ): การเข้ารหัสเหล่านี้จะจับคู่ชุดอักขระทั่วไปกับ ตัวเลขระหว่าง 0 ถึง 255 (เช่นไบต์); การแลกเปลี่ยนไฟล์ที่ค่อนข้าง จำกัด ก่อนการกำเนิดของเว็บทำให้สถานการณ์ของการเข้ารหัสที่เข้ากันไม่ได้นี้สามารถยอมรับได้เนื่องจากโปรแกรมส่วนใหญ่สามารถเพิกเฉยต่อข้อเท็จจริงที่ว่ามีการเข้ารหัสหลายครั้งตราบใดที่พวกเขาสร้างข้อความที่ยังคงอยู่บนระบบปฏิบัติการเดียวกัน: โปรแกรมดังกล่าวจะ ถือว่าข้อความเป็นไบต์ (ผ่านการเข้ารหัสที่ใช้โดยระบบปฏิบัติการ) มุมมองที่ทันสมัยและถูกต้องจะแยกแนวคิดสตริงทั้งสองนี้อย่างเหมาะสมโดยยึดตามสองจุดต่อไปนี้:

  1. ตัวละครส่วนใหญ่ไม่เกี่ยวข้องกับคอมพิวเตอร์ : สามารถวาดบนกระดานชอล์กเป็นต้นเช่นبايثون, 中蟒และ🐍 "อักขระ" สำหรับเครื่องยังรวมถึง "คำแนะนำในการวาด" เช่นการเว้นวรรคการกลับรถคำแนะนำในการกำหนดทิศทางการเขียน (สำหรับภาษาอาหรับ ฯลฯ ) การเน้นเสียง ฯลฯรายการอักขระที่มีขนาดใหญ่มากจะรวมอยู่ในมาตรฐานUnicode ครอบคลุมตัวละครที่รู้จักเกือบทั้งหมด

  2. ในทางกลับกันคอมพิวเตอร์จำเป็นต้องแสดงอักขระนามธรรมไม่ทางใดก็ทางหนึ่ง: สำหรับสิ่งนี้พวกเขาใช้อาร์เรย์ของไบต์ (รวมตัวเลขระหว่าง 0 ถึง 255) เนื่องจากหน่วยความจำของพวกเขามาในหน่วยไบต์ กระบวนการที่จำเป็นที่ตัวละครแปรรูปไบต์จะเรียกว่าการเข้ารหัส ดังนั้นคอมพิวเตอร์จึงต้องมีการเข้ารหัสเพื่อแสดงอักขระ ข้อความใด ๆ ที่อยู่ในคอมพิวเตอร์ของคุณจะถูกเข้ารหัส (จนกว่าจะแสดง) ไม่ว่าจะถูกส่งไปยังเทอร์มินัล (ซึ่งคาดว่าจะมีการเข้ารหัสอักขระในลักษณะเฉพาะ) หรือบันทึกไว้ในไฟล์ เพื่อที่จะแสดงหรือ "เข้าใจ" อย่างถูกต้อง (โดยพูดว่า Python interpreter) สตรีมของไบต์จะถูกถอดรหัสเป็นอักขระ การเข้ารหัสเล็กน้อย(UTF-8, UTF-16, …) ถูกกำหนดโดย Unicode สำหรับรายการอักขระ (ดังนั้น Unicode จึงกำหนดทั้งรายการอักขระและการเข้ารหัสสำหรับอักขระเหล่านี้ - ยังมีที่ที่เราเห็นนิพจน์ "การเข้ารหัส Unicode" เป็น วิธีอ้างถึง UTF-8 ที่แพร่หลาย แต่เป็นคำศัพท์ที่ไม่ถูกต้องเนื่องจาก Unicode มีการเข้ารหัสหลายรายการ )

โดยสรุปคอมพิวเตอร์จำเป็นต้องแทนอักขระภายในด้วยไบต์และดำเนินการผ่านสองการดำเนินการ:

การเข้ารหัส : อักขระ→ไบต์

การถอดรหัส : ไบต์→อักขระ

การเข้ารหัสบางอย่างไม่สามารถเข้ารหัสอักขระทั้งหมด (เช่น ASCII) ในขณะที่ (บางตัว) การเข้ารหัส Unicode อนุญาตให้คุณเข้ารหัสอักขระ Unicode ทั้งหมด การเข้ารหัสนั้นไม่จำเป็นต้องซ้ำกันเนื่องจากอักขระบางตัวสามารถแสดงได้โดยตรงหรือเป็นชุดค่าผสม (เช่นอักขระพื้นฐานและการเน้นเสียง)

โปรดทราบว่าแนวคิดของการขึ้นบรรทัดใหม่ เพิ่มเลเยอร์ของความซับซ้อนเนื่องจากสามารถแสดงด้วยอักขระ (ตัวควบคุม) ที่แตกต่างกันซึ่งขึ้นอยู่กับระบบปฏิบัติการ (นี่คือสาเหตุของโหมดการอ่านไฟล์นิวไลน์สากลของ Python )

ตอนนี้สิ่งที่ฉันเรียกว่า "อักขระ" ข้างต้นคือสิ่งที่ Unicode เรียกว่า "อักขระที่ผู้ใช้รับรู้ " บางครั้งอักขระที่ผู้ใช้รับรู้เพียงตัวเดียวสามารถแสดงใน Unicode ได้โดยการรวมส่วนของอักขระ (อักขระพื้นฐาน, สำเนียง, ... ) ที่พบในดัชนีต่างๆในรายการ Unicode ซึ่งเรียกว่า " จุดรหัส " - จุดรหัสเหล่านี้สามารถรวมเข้าด้วยกันเพื่อสร้าง "คลัสเตอร์ grapheme" ดังนั้น Unicode จึงนำไปสู่แนวคิดที่สามของสตริงซึ่งทำจากลำดับของจุดรหัส Unicode ซึ่งอยู่ระหว่างไบต์และสตริงอักขระและใกล้เคียงกับสตริงหลังมากกว่า ฉันจะเรียกมันว่า " Unicode strings " (เหมือนใน Python 2)

ในขณะที่ Python สามารถพิมพ์สตริงของอักขระ (ที่ผู้ใช้รับรู้) สตริงที่ไม่ใช่ไบต์ของ Python เป็นลำดับของจุดโค้ด Unicodeไม่ใช่อักขระที่ผู้ใช้รับรู้ ค่าจุดรหัสคือค่าที่ใช้ในไวยากรณ์สตริงของ Python \uและ\UUnicode ไม่ควรสับสนกับการเข้ารหัสอักขระ (และไม่ต้องแบกรับความสัมพันธ์ใด ๆ กับมัน: จุดรหัส Unicode สามารถเข้ารหัสได้หลายวิธี)

สิ่งนี้มีผลลัพธ์ที่สำคัญ: ความยาวของสตริง Python (Unicode) คือจำนวนจุดรหัสซึ่งไม่ใช่จำนวนอักขระที่ผู้ใช้รับรู้เสมอไปดังนั้นs = "\u1100\u1161\u11a8"; print(s, "len", len(s))(Python 3) ให้각 len 3แม้จะsมีผู้ใช้เพียงคนเดียว (ภาษาเกาหลี) อักขระ (เนื่องจากแสดงด้วยจุดรหัส 3 จุดแม้ว่าจะไม่จำเป็นต้องprint("\uac01")แสดงก็ตาม) อย่างไรก็ตามในทางปฏิบัติหลายประการความยาวของสตริงคือจำนวนอักขระที่ผู้ใช้รับรู้เนื่องจากโดยทั่วไปแล้วอักขระจำนวนมากจะถูกจัดเก็บโดย Python เป็นจุดรหัส Unicode เดียว

ในPython 2สตริง Unicode เรียกว่า… "Unicode strings" ( unicodetype, literal form u"…") ในขณะที่ byte arrays คือ "strings" ( strพิมพ์ซึ่งอาร์เรย์ของไบต์สามารถสร้างด้วยตัวอักษรสตริงได้"…") ในPython 3สตริง Unicode เรียกง่ายๆว่า "strings" ( strtype, literal form "…") ในขณะที่ไบต์อาร์เรย์คือ "ไบต์" ( bytesชนิด, รูปแบบตามตัวอักษรb"…") ด้วยเหตุนี้บางอย่าง"🐍"[0]จึงให้ผลลัพธ์ที่แตกต่างกันใน Python 2 ( '\xf0', a byte) และ Python 3 ( "🐍"อักขระตัวแรกและตัวเดียว)

ด้วยประเด็นสำคัญบางประการเหล่านี้คุณจะเข้าใจคำถามที่เกี่ยวข้องกับการเข้ารหัสได้มากที่สุด!


โดยปกติเมื่อคุณพิมพ์ u"…" ไปที่เทอร์มินัลคุณไม่ควรได้รับขยะ: Python รู้การเข้ารหัสของเทอร์มินัลของคุณ ในความเป็นจริงคุณสามารถตรวจสอบการเข้ารหัสที่เทอร์มินัลต้องการ:

% python
Python 2.7.6 (default, Nov 15 2013, 15:20:37) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.stdout.encoding
UTF-8

หากอักขระอินพุตของคุณสามารถเข้ารหัสด้วยการเข้ารหัสของเทอร์มินัล Python จะทำเช่นนั้นและจะส่งไบต์ที่เกี่ยวข้องไปยังเทอร์มินัลของคุณโดยไม่บ่น จากนั้นเทอร์มินัลจะพยายามอย่างเต็มที่ในการแสดงอักขระหลังจากถอดรหัสไบต์อินพุต (ที่แย่ที่สุดคือฟอนต์เทอร์มินัลไม่มีอักขระบางตัวและจะพิมพ์ค่าว่างบางประเภทแทน)

หากอักขระอินพุตของคุณไม่สามารถเข้ารหัสด้วยการเข้ารหัสของเทอร์มินัลแสดงว่าไม่มีการกำหนดค่าเทอร์มินัลให้แสดงอักขระเหล่านี้ Python จะบ่น (ใน Python ที่มีUnicodeEncodeErrorเนื่องจากไม่สามารถเข้ารหัสสตริงอักขระด้วยวิธีที่เหมาะสมกับเทอร์มินัลของคุณ) ทางออกเดียวที่เป็นไปได้คือการใช้เทอร์มินัลที่สามารถแสดงอักขระ (ไม่ว่าจะโดยการกำหนดค่าเทอร์มินัลเพื่อให้ยอมรับการเข้ารหัสที่สามารถแทนอักขระของคุณหรือโดยใช้โปรแกรมเทอร์มินัลอื่น) นี่เป็นสิ่งสำคัญเมื่อคุณแจกจ่ายโปรแกรมที่สามารถใช้ได้ในสภาพแวดล้อมที่แตกต่างกัน: ข้อความที่คุณพิมพ์ควรแสดงได้ในเทอร์มินัลของผู้ใช้ บางครั้งจึงเป็นการดีที่สุดที่จะยึดติดกับสตริงที่มีเฉพาะอักขระ ASCII

อย่างไรก็ตามเมื่อคุณเปลี่ยนเส้นทางหรือไพพ์เอาต์พุตของโปรแกรมของคุณโดยทั่วไปจะไม่สามารถทราบได้ว่าการเข้ารหัสอินพุตของโปรแกรมรับคืออะไรและโค้ดด้านบนจะส่งคืนการเข้ารหัสเริ่มต้นบางส่วน: ไม่มี (Python 2.7) หรือ UTF-8 ( Python 3):

% python2.7 -c "import sys; print sys.stdout.encoding" | cat
None
% python3.4 -c "import sys; print(sys.stdout.encoding)" | cat
UTF-8

อย่างไรก็ตามการเข้ารหัสของ stdin, stdout และ stderr สามารถตั้งค่าผ่านPYTHONIOENCODINGตัวแปรสภาพแวดล้อมได้หากจำเป็น:

% PYTHONIOENCODING=UTF-8 python2.7 -c "import sys; print sys.stdout.encoding" | cat
UTF-8

หากการพิมพ์ไปยังเครื่องปลายทางไม่ได้ผลลัพธ์ตามที่คุณคาดหวังคุณสามารถตรวจสอบว่าการเข้ารหัส UTF-8 ที่คุณใส่ด้วยตนเองนั้นถูกต้อง เช่นตัวอักษรตัวแรกของคุณ ( \u001A) ไม่ได้พิมพ์ถ้าฉันไม่ผิด

ที่http://wiki.python.org/moin/PrintFailsคุณจะพบวิธีแก้ปัญหาดังต่อไปนี้สำหรับ Python 2.x:

import codecs
import locale
import sys

# Wrap sys.stdout into a StreamWriter to allow writing unicode.
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout) 

uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni

สำหรับ Python 3 คุณสามารถตรวจสอบหนึ่งในคำถามที่ถามก่อนหน้านี้ใน StackOverflow


2
@singularity: ขอบคุณ! ฉันเพิ่มข้อมูลบางอย่างสำหรับ Python 3
Eric O Lebigot

2
ขอบคุณผู้ชาย! ฉันต้องการคำอธิบายนี้มานานแล้ว ... น่าเสียดายที่ฉันสามารถโหวตให้คุณได้เพียงครั้งเดียว
mik01aj

3
ฉันดีใจที่ได้รับความช่วยเหลือ @ m01! แรงจูงใจอย่างหนึ่งในการเขียนคำตอบนี้คือมีหลายหน้าบนเว็บเกี่ยวกับ Unicode และ Python แต่ฉันพบว่าแม้จะน่าสนใจ แต่ก็ไม่เคยอนุญาตให้ฉันแก้ไขปัญหาการเข้ารหัสที่เป็นรูปธรรมได้อย่างสมบูรณ์ ... ฉันเชื่ออย่างแท้จริงว่าโดยคำนึงถึง หลักการที่พบในคำตอบนี้และการใช้เวลาในการแก้ปัญหาการเข้ารหัสที่เป็นรูปธรรมช่วยได้มาก
Eric O Lebigot

3
นี่คือคำอธิบายที่ดีที่สุดของ unicode และ python ที่เคยมีมา Python Unicode HOWTO ควรถูกแทนที่ด้วยสิ่งนี้
stantonk

1
ขอผมวาดตัวอักษร“ เขียนทับขวาไปซ้าย” บนกระดานนี้…
icktoofay

20

Python จะเข้ารหัสสตริง Unicode เสมอเมื่อเขียนไปยังเทอร์มินัลไฟล์ไปป์ ฯลฯ เมื่อเขียนไปยังเทอร์มินัล Python มักจะสามารถกำหนดการเข้ารหัสของเทอร์มินัลและใช้งานได้อย่างถูกต้อง เมื่อเขียนไปยังไฟล์หรือไพ ธ อนกำหนดค่าเริ่มต้นเป็นการเข้ารหัส 'ascii' เว้นแต่จะบอกไว้เป็นอย่างอื่นอย่างชัดเจน Python สามารถบอกได้ว่าต้องทำอย่างไรเมื่อส่งเอาต์พุตผ่านPYTHONIOENCODINGตัวแปรสภาพแวดล้อม เชลล์สามารถตั้งค่าตัวแปรนี้ก่อนเปลี่ยนเส้นทางเอาต์พุต Python ไปยังไฟล์หรือไพพ์เพื่อให้ทราบการเข้ารหัสที่ถูกต้อง

ในกรณีของคุณคุณได้พิมพ์อักขระผิดปกติ 4 ตัวที่เครื่องปลายทางของคุณไม่รองรับในแบบอักษร นี่คือตัวอย่างบางส่วนที่จะช่วยอธิบายพฤติกรรมด้วยอักขระที่เทอร์มินัลของฉันรองรับ (ซึ่งใช้ cp437 ไม่ใช่ UTF-8)

ตัวอย่าง 1

โปรดทราบว่า#codingข้อคิดเห็นระบุการเข้ารหัสที่บันทึกไฟล์ต้นทาง ฉันเลือก utf8 ดังนั้นฉันจึงสามารถรองรับอักขระในแหล่งที่มาที่เทอร์มินัลของฉันไม่สามารถทำได้ การเข้ารหัสเปลี่ยนเส้นทางไปยัง stderr เพื่อให้สามารถมองเห็นได้เมื่อเปลี่ยนเส้นทางไปยังไฟล์

#coding: utf8
import sys
uni = u'αßΓπΣσµτΦΘΩδ∞φ'
print >>sys.stderr,sys.stdout.encoding
print uni

เอาต์พุต (ทำงานโดยตรงจากเทอร์มินัล)

cp437
αßΓπΣσµτΦΘΩδ∞φ

Python กำหนดการเข้ารหัสของเทอร์มินัลอย่างถูกต้อง

เอาต์พุต (เปลี่ยนเส้นทางไปยังไฟล์)

None
Traceback (most recent call last):
  File "C:\ex.py", line 5, in <module>
    print uni
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-13: ordinal not in range(128)

Python ไม่สามารถกำหนดการเข้ารหัส (ไม่มี) จึงใช้ค่าเริ่มต้น 'ascii' ASCII รองรับการแปลงอักขระ 128 ตัวแรกของ Unicode เท่านั้น

เอาต์พุต (เปลี่ยนเส้นทางไปยังไฟล์, PYTHONIOENCODING = cp437)

cp437

และไฟล์ผลลัพธ์ของฉันถูกต้อง:

C:\>type out.txt
αßΓπΣσµτΦΘΩδ∞φ

ตัวอย่าง 2

ตอนนี้ฉันจะเพิ่มตัวละครในแหล่งที่มาที่เทอร์มินัลของฉันไม่รองรับ:

#coding: utf8
import sys
uni = u'αßΓπΣσµτΦΘΩδ∞φ马' # added Chinese character at end.
print >>sys.stderr,sys.stdout.encoding
print uni

เอาต์พุต (ทำงานโดยตรงจากเทอร์มินัล)

cp437
Traceback (most recent call last):
  File "C:\ex.py", line 5, in <module>
    print uni
  File "C:\Python26\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u9a6c' in position 14: character maps to <undefined>

เครื่องปลายทางของฉันไม่เข้าใจอักษรจีนตัวสุดท้าย

เอาต์พุต (ทำงานโดยตรง PYTHONIOENCODING = 437: แทนที่)

cp437
αßΓπΣσµτΦΘΩδ∞φ?

ตัวจัดการข้อผิดพลาดสามารถระบุได้ด้วยการเข้ารหัส ?ในกรณีนี้ตัวละครที่ไม่รู้จักถูกแทนที่ด้วย ignoreและxmlcharrefreplaceเป็นตัวเลือกอื่น ๆ เมื่อใช้ UTF8 (ซึ่งรองรับการเข้ารหัสอักขระ Unicode ทั้งหมด) จะไม่มีการแทนที่ แต่แบบอักษรที่ใช้แสดงอักขระจะต้องรองรับ


ไม่เป็นความจริงอย่างแน่นอนที่ว่า "เมื่อเขียนไปยังไฟล์หรือไพพ์ไพ ธ อนจะตั้งค่าเริ่มต้นเป็นการเข้ารหัส" ascii "เว้นแต่จะระบุไว้เป็นอย่างอื่นอย่างชัดเจน" ในความเป็นจริง Python 3 ใช้ UTF-8 บน Mac OS X / Fink
Eric O Lebigot

2
ใช่ Python 3 มีค่าเริ่มต้นเป็น 'utf8' แต่จากตัวอย่างของ OP เขาใช้ Python 2.X ซึ่งมีค่าเริ่มต้นเป็น 'ascii'
Mark Tolonen

PYTHONIOENCODINGฉันไม่สามารถได้รับผลที่ถูกต้องโดยการจัดการ การทำprint string.encode("UTF-8")ตามที่ @Ismail แนะนำได้ผลสำหรับฉัน
tripleee

คุณสามารถดูตัวอักษรจีนได้หากแบบอักษรของคุณรองรับแม้ว่าหน้าchcpรหัสจะไม่รองรับก็ตาม เพื่อหลีกเลี่ยงUnicodeEncodeError: 'charmap'คุณสามารถติดตั้งwin-unicode-consoleแพ็คเกจ
jfs

ปัญหาของฉันคือ python-gitlab CLI พิมพ์ตัวอักษรจีนได้ดีใน cmd แต่ตัวอักษรเป็นขยะหลังจากถูกเปลี่ยนเส้นทางไปยังไฟล์ PYTHONIOENCODING=utf-8แก้ปัญหา
ElpieKay

12

เข้ารหัสขณะพิมพ์

uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni.encode("utf-8")

เนื่องจากเมื่อคุณรันสคริปต์ด้วยตนเอง python จะเข้ารหัสก่อนที่จะส่งออกไปยังเทอร์มินัลเมื่อคุณไปป์ python ไม่ได้เข้ารหัสตัวเองดังนั้นคุณต้องเข้ารหัสด้วยตนเองเมื่อทำ I / O


4
มันยังไม่ตอบคำถาม WTH เกิดขึ้นที่นี่ ทำไมจากสีน้ำเงินจึงตัดสินใจที่จะเข้ารหัสเฉพาะเมื่อเปลี่ยนเส้นทางเมื่อสิ่งนี้ควรจะโปร่งใสอย่างสมบูรณ์กับกระบวนการ
Maxim Sloyko

เหตุใด python จึงไม่เข้ารหัสเมื่อทำการเปลี่ยนเส้นทาง python ตรวจสอบอย่างชัดเจนและตัดสินใจว่าจะทำสิ่งที่แตกต่างออกไปหรือไม่?
Arafangion

1
python มีวิธีแยกแยะสองสถานการณ์หรือไม่? ฉัน (จนถึงตอนนี้ ... ) ไม่มีทางรู้ได้
zedoo

4
Python สามารถตรวจสอบว่าเอาต์พุตเป็นเทอร์มินัลหรือไม่ถ้าเอาต์พุตไปยังไพพ์ประเภทเทอร์มินัลจะเป็น "ใบ้" ฉันเดาว่า "โง่" น่าจะบอกคุณได้ว่าทำไม Python ไม่พยายามทำอะไรโดยอัตโนมัติในกรณีนี้มันอาจล้มเหลว
ismail

1
มันสร้าง mojibake หากสภาพแวดล้อมใช้การเข้ารหัสอักขระที่เข้ากันไม่ได้กับ utf-8 (เช่นเป็นเรื่องปกติใน Windows) อย่าฮาร์ดโค้ดการเข้ารหัสอักขระของสภาพแวดล้อมภายในสคริปต์ของคุณ กำหนดค่าภาษาของคุณหรือ PYTHONIOENCODING ของคุณหรือติดตั้งwin-unicode-console(Windows) หรือยอมรับพารามิเตอร์บรรทัดคำสั่ง (ถ้าคุณต้อง)
jfs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.