ขออภัยสำหรับการคืนคำถามเก่านี้ แต่เมื่อใช้bashมีวิธีง่ายมากในการสร้าง Unicode codepoints จากอินพุต ASCII ธรรมดาซึ่งแม้จะไม่แยกเลย:
unicode() { local -n a="$1"; local c; printf -vc '\\U%08x' "$2"; printf -va "$c"; }
unicodes() { local a c; for a; do printf -vc '\\U%08x' "$a"; printf "$c"; done; };
ใช้มันดังต่อไปนี้เพื่อกำหนด codepoints บางอย่าง
unicode crossbones 0x2620
echo "$crossbones"
หรือถ่ายโอน codepoints 65536 unicode แรกไปยัง stdout (ใช้เวลาน้อยกว่า 2 วินาทีบนเครื่องของฉันพื้นที่เพิ่มเติมคือการป้องกันไม่ให้ตัวละครบางตัวไหลเข้าหากันเนื่องจากตัวอักษร monospace ของเชลล์):
for a in {0..65535}; do unicodes "$a"; printf ' '; done
หรือเพื่อบอกเล่าเรื่องราวของผู้ปกครองทั่วไปเล็กน้อย (สิ่งนี้ต้องการ Unicode 2010):
unicodes 0x1F6BC 32 43 32 0x1F62D 32 32 43 32 0x1F37C 32 61 32 0x263A 32 32 43 32 0x1F4A9 10
คำอธิบาย:
printf '\UXXXXXXXX' พิมพ์อักขระ Unicode ใด ๆ
printf '\\U%08x' numberพิมพ์\UXXXXXXXXด้วยจำนวนที่แปลงเป็น Hex จากนั้นจะถูกป้อนไปที่อื่นprintfเพื่อพิมพ์อักขระ Unicode
printf รู้จักเลขฐานแปด (0oct), เลขฐานสิบหก (0xHEX) และทศนิยม (0 หรือตัวเลขที่ขึ้นต้นด้วย 1 ถึง 9) เป็นตัวเลขดังนั้นคุณสามารถเลือกได้ว่าการแสดงใดที่เหมาะที่สุด
printf -v var ..รวบรวมผลลัพธ์ของprintfการเป็นตัวแปรโดยไม่ต้องแยก (ซึ่งเร็วขึ้นอย่างมากสิ่งต่าง ๆ )
local variable จะไม่มีการสร้างมลภาวะเนมสเปซส่วนกลาง
local -n var=otherนามแฝงvarไปotherเช่นการมอบหมายให้ที่altersvar otherส่วนที่น่าสนใจหนึ่งที่นี่คือที่varเป็นส่วนหนึ่งของ namespace ท้องถิ่นในขณะที่otherเป็นส่วนหนึ่งของ namespace ทั่วโลก
- โปรดทราบว่าไม่มีสิ่งดังกล่าวเป็น
localหรือglobalnamespace bashใน ตัวแปรจะถูกเก็บไว้ในสภาพแวดล้อมและเช่นนั้นเป็นระดับโลกเสมอ เฉพาะที่จะทำให้ค่าปัจจุบันหายไปและกู้คืนเมื่อฟังก์ชันถูกทิ้งอีกครั้ง ฟังก์ชั่นอื่น ๆ ที่เรียกจากภายในฟังก์ชั่นด้วยlocalจะยังคงเห็นค่า "ท้องถิ่น" นี่เป็นแนวคิดพื้นฐานที่แตกต่างจากกฎการกำหนดขอบเขตปกติที่พบในภาษาอื่น (และสิ่งที่bashมีประสิทธิภาพมาก แต่อาจนำไปสู่ข้อผิดพลาดหากคุณเป็นโปรแกรมเมอร์ที่ไม่ทราบว่า)
"\x7F"ในโลแคล UTF-8 (ซึ่งbashแท็กแนะนำให้คุณทราบ) ... รูปแบบที่แทนด้วยไบต์เดียวจะไม่อยู่ในช่วง\x80-\xFF. ช่วงนี้ผิดกฎหมายในตัวอักษร UTF-8 แบบซิงก์ไบต์ เช่นค่า Unicode Codepoint ของU+0080(เช่น.\x80) จริง ๆ แล้วคือ 2 ไบต์ใน UTF-8 ..\xC2\x80..