UTF-8คือการเข้ารหัสความยาวผันแปรของ Unicode มันถูกออกแบบมาให้เป็นชุดของ ASCII ดูWikipediaสำหรับรายละเอียดของการเข้ารหัส \x00 \x01 \xF6 \x15จะเป็นUCS-4BEหรือUTF-32BEเข้ารหัส
ในการรับจากรหัส Unicode ชี้ไปที่การเข้ารหัส UTF-8 โดยสมมติว่า charmap ของโลแคลคือ UTF-8 (ดูผลลัพธ์ของlocale charmap) มันเป็นเพียง:
$ printf '\U1F615\n'
😕
$ echo -e '\U1F615'
😕
$ confused_face=$'\U1F615'
หลังจะอยู่ในเวอร์ชันถัดไปของมาตรฐาน POSIXจะอยู่ในรุ่นถัดไปของมาตรฐาน
AFAIK ไวยากรณ์ที่ถูกนำมาใช้ในปี 2000 โดยแบบสแตนด์อโลน GNU printfยูทิลิตี้ (เมื่อเทียบกับprintfยูทิลิตี้ของ GNU เปลือก) นำไปecho/ printf/ $'...'builtins แรกโดยzshในปี 2003 , ksh93 ในปี 2004 ทุบตีในปี 2010 ( แต่ทำงานไม่ถูกต้องมี จนถึงปี 2014 ) แต่ได้รับแรงบันดาลใจจากภาษาอื่นอย่างเห็นได้ชัด
ksh93นอกจากนี้ยังสนับสนุนเป็นและprintf '\x1f615\n'printf '\u{1f615}\n'
$'\uXXXX'และ$'\UXXXXXXXX'ได้รับการสนับสนุนโดยzsh, bash, ksh93, mkshและ FreeBSD sh, GNU แอฟริกาprintfecho
บางคนต้องการตัวเลขทั้งหมด (ซึ่ง\U0001F615ตรงข้ามกับ\U1F615) แม้ว่าอาจมีการเปลี่ยนแปลงในรุ่นอนาคตเนื่องจาก POSIX จะอนุญาตให้ตัวเลขน้อยลง ในกรณีใด ๆ คุณต้องมีตัวเลขทั้งหมดหาก\UXXXXXXXXจะต้องตามด้วยเลขฐานสิบหกเช่นเดียวกับใน\U0001F615FOXตามที่\U1F615FOXจะได้รับ$'\U001F615F'OXจะได้รับ
บางตัวขยายไปยังอักขระในการเข้ารหัสของโลแคลปัจจุบัน ณ เวลาที่สตริงถูกวิเคราะห์คำหรือ ณ เวลาที่ขยายตัวบางตัวใน UTF-8 โดยไม่คำนึงถึงโลแคล หากอักขระไม่พร้อมใช้งานในการเข้ารหัสของโลแคลปัจจุบันลักษณะการทำงานจะแตกต่างกันระหว่างเชลล์
ดังนั้นเพื่อการพกพาที่ดีที่สุดสิ่งที่ดีที่สุดคือใช้เฉพาะในโลแคล UTF-8 และใช้ตัวเลขทั้งหมดและใช้ใน$'...':
printf '%s\n' $'\U0001F615'
โปรดทราบว่า:
LC_ALL=C.UTF-8; printf '%s\n' $'\U0001F615'
หรือ:
{
LC_ALL=C.UTF-8
printf '%s\n' $'\U0001F615'
}
จะไม่ทำงานกับเชลล์ทั้งหมด (รวมถึงbash) เพราะ$'\U0001F615'ถูกวิเคราะห์คำก่อนLC_ALLกำหนด (โปรดทราบว่าไม่มีการรับประกันว่าระบบจะมีโลแคลที่เรียกว่าC.UTF-8)
คุณต้องการ:
LC_ALL=C.UTF-8; eval "confused_face=$'\U0001F615'"
หรือ:
LC_ALL=C.UTF-8
printf '%s\n' $'\U0001F615'
(ไม่อยู่ในคำสั่งผสมหรือฟังก์ชั่น)
สำหรับย้อนกลับจะได้รับจากการเข้ารหัส UTF-8 กับ Unicode รหัสจุดเห็นนี้คำถามอื่น ๆหรือที่หนึ่ง
$ unicode 😕
U+1F615 CONFUSED FACE
UTF-8: f0 9f 98 95 UTF-16BE: d83dde15 Decimal: 😕
😕
Category: So (Symbol, Other)
Bidi: ON (Other Neutrals)
$ perl -CA -le 'printf "%x\n", ord shift' 😕
1f615
\U1F615ตามด้วยเลขฐานสิบหกหลักที่ถูกต้องแล้วจะถือว่าเป็นส่วนหนึ่งของลำดับการหลบหนี เพื่อให้มันทำงานโดยไม่คำนึงถึงสิ่งที่ตามมามันจะต้องมีศูนย์นำหน้ามากพอที่จะมีความยาวแปดหลักอย่างแน่นอน\U0001F615