ขออภัยสำหรับการคืนคำถามเก่านี้ แต่เมื่อใช้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
หรือglobal
namespace bash
ใน ตัวแปรจะถูกเก็บไว้ในสภาพแวดล้อมและเช่นนั้นเป็นระดับโลกเสมอ เฉพาะที่จะทำให้ค่าปัจจุบันหายไปและกู้คืนเมื่อฟังก์ชันถูกทิ้งอีกครั้ง ฟังก์ชั่นอื่น ๆ ที่เรียกจากภายในฟังก์ชั่นด้วยlocal
จะยังคงเห็นค่า "ท้องถิ่น" นี่เป็นแนวคิดพื้นฐานที่แตกต่างจากกฎการกำหนดขอบเขตปกติที่พบในภาษาอื่น (และสิ่งที่bash
มีประสิทธิภาพมาก แต่อาจนำไปสู่ข้อผิดพลาดหากคุณเป็นโปรแกรมเมอร์ที่ไม่ทราบว่า)
"\x7F"
ในโลแคล UTF-8 (ซึ่งbash
แท็กแนะนำให้คุณทราบ) ... รูปแบบที่แทนด้วยไบต์เดียวจะไม่อยู่ในช่วง\x80-\xFF
. ช่วงนี้ผิดกฎหมายในตัวอักษร UTF-8 แบบซิงก์ไบต์ เช่นค่า Unicode Codepoint ของU+0080
(เช่น.\x80
) จริง ๆ แล้วคือ 2 ไบต์ใน UTF-8 ..\xC2\x80
..